gpt4 book ai didi

java - 使用 RxJava Observables 组合成并行下载图像的 Map

转载 作者:行者123 更新时间:2023-12-01 22:14:55 25 4
gpt4 key购买 nike

我正在尝试并行下载图像列表,并将它们组合到 map 中。

起初我尝试制作这样的 Observable:

Observable<Map<Integer, Bitmap>> getImages(final List<Activity> activities) {
return Observable.create(new Observable.OnSubscribe<Map<Integer, Bitmap>>() {
@Override
public void call(Subscriber<? super Map<Integer, Bitmap>> subscriber) {
try {
Map<Integer, Bitmap> result = new HashMap<Integer, Bitmap>();
for (Activity act : activities) {
result.put(act.getId(), downloadImage(act.getImage()));
}
subscriber.onNext(result);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
});
}

这可行,但这不是我想要的。因为图像是按顺序下载的。我认为 for 循环在 rxjava 中不太好。所以我创建了这些可观察对象:

    Observable<Bitmap> getImage(final Activity activity) {
return Observable.create(new Observable.OnSubscribe<Bitmap>() {
@Override
public void call(Subscriber<? super Bitmap> subscriber) {
try {
subscriber.onNext(downloadImage(activity.getImage()));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
});
}

Observable<Map<Integer, Bitmap>> getImages(final List<Activity> activities) {
return Observable
.from(activities)
.flatMap(new Func1<Activity, Observable<Bitmap>>() {
@Override
public Observable<Bitmap> call(Activity activity) {
return getImage(activity);
}
})
.toMap(new Func1<Bitmap, Integer>() {
@Override
public Integer call(Bitmap bitmap) {
return 1; // How am I supposed to get the activity.getId()?
}
});
}

所以我制作了一个 Observable 来获取单个图像,尝试使用 flatMap 将它们组合到第二个图像中。这可行,但仍然有 2 个问题:

  1. 当我执行 toMap() 时,如何检索正确的 id 来用作 map 的键?我想为此使用 Activity 对象。
  2. 遗憾的是,下载仍在按顺序而非并行处理。我该如何解决这个问题?

最佳答案

创建一个包含位图和 Activity 的包装类。说ActivityBitmap 。替换getImagegetActivityBitmap :

Observable<ActivityBitmap> getActivityBitmap(final Activity activity) {
return Observable.create(new Observable.OnSubscribe<ActivityBitmap>() {
@Override
public void call(Subscriber<? super ActivityBitmap> subscriber) {
try {
subscriber.onNext(new ActivityBitmap(activity, downloadImage(activity.getImage())));
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
});
}

并像下面这样调用它。请注意,要获得异步下载,请使用 subscribeOnflatMap 。构建Map<Integer,Bitmap>最后你使用不同的重载 toMap它允许您指定键和值。

Observable<Map<Integer, Bitmap>> getImages(final List<Activity> activities) {
return Observable
.from(activities)
.flatMap(new Func1<Activity, Observable<ActivityBitmap>>() {
@Override
public Observable<ActivityBitmap> call(Activity activity) {
return getActivityBitmap(activity).subscribeOn(Schedulers.io());
}
})
.toMap(new Func1<ActivityBitmap, Integer>() {
@Override
public Integer call(ActivityBitmap activityBitmap) {
return activityBitmap.getActivity().getId();
}
},new Func1<ActivityBitmap, Bitmap>() {
@Override
public Integer call(ActivityBitmap activityBitmap) {
return activityBitmap.getBitmap();
}
});
}

关于java - 使用 RxJava Observables 组合成并行下载图像的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31268922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com