我是RxJava的新手。我有一个bitmapObservable
用于下载图片网址列表并将其转换为位图的简单网络操作。
mSubscription = Observable.create(new Observable.OnSubscribe<Bitmap[]>() {
@Override
public void call(final Subscriber<? super Bitmap[]> subscriber) {
String[] urls = new String[]{
"http://www.convertimage.net/frontframe/images/cute_ball_info.png",
"http://customerserviceai.com/wp-content/uploads/2016/08/waiting.png",
"https://images.google.com/images/branding/googleg/1x/googleg_standard_color_128dp.png"};
Bitmap[] bitmaps = new Bitmap[urls.length];
int i = 0;
for (String url : urls) {
final Bitmap bitmap = Downloader.getBitmapFromURL(url);
if (bitmap == null) {
subscriber.onError(new IOException());
} else {
bitmaps[i++] = bitmap;
Log.d(TAG, "Bitmap " + url + " downloaded" + bitmap);
}
}
subscriber.onNext(bitmaps);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Bitmap[]>() {
@Override
public void onCompleted() {
Log.d(TAG, "Everything completed");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Some error has been occured");
}
@Override
public void onNext(Bitmap[] bitmaps) {
Log.d(TAG, "Downloaded bitmaps " + bitmaps);
}
});
在活动的onDestroy
上,我取消订阅observable以避免内存泄漏。
@Override
protected void onDestroy() {
mSubscription.unsubscribe();
super.onDestroy();
}
我可以看到,如果我在图像下载过程中退出活动,后台任务也会被杀死。我只想继续执行背景任务,即使我已从观察员那里取消订阅。可能吗?
答案 0 :(得分:0)
这不是一个真正的RxJava问题。在Android中,如果您希望您的后台任务在Activity死亡后仍然存在,您可以使用Service。有两种服务,后台和前台服务。
但后台服务还不够,Android不保证你的应用程序在后台运行时不会被杀死。伊恩湖在his blog post中很好地解释了它。
因此,为了确保您的应用程序保持下载,您可以使用前台服务。此模式通常用于音乐播放器应用程序,即使在用户锁定屏幕后,您仍然可以在后台听到音乐,因为应用程序仍在后台运行。
但是,如果您仍想使用RxJava来解决问题,可以使用Subject。在主题上保存下载进度,当您想继续下载时,只需再次发出Observable。