RxJava - 如何在取消订阅 observable 后继续后台任务

3

我是RxJava的新手。我有一个bitmapObservable,用于下载图像URL列表并将其转换为位图的简单网络操作。

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);
                }
            });

在Activity的onDestroy方法中,我会取消订阅Observable,以避免内存泄漏。
  @Override
protected void onDestroy() {
    mSubscription.unsubscribe();
    super.onDestroy();
}

我所看到的是,在图片下载过程中,如果我离开了活动界面,后台任务也会被杀死。我只想要继续后台任务,即使我已经取消订阅观察者。这可能吗?


如果您取消订阅可观察对象,那是不行的。 - AJay
1个回答

0

这不是一个真正的 RxJava 问题。在 Android 中,如果您希望后台任务在 Activity 死后仍存在,可以使用 Service。有两种服务类型:后台服务和前台服务。

但是,仅使用后台服务是不够的,Android 不能保证如果它在后台运行,您的应用程序不会被杀死。Ian Lake 在 他的博客文章 中很好地解释了这一点。

因此,为了确保您的应用程序继续下载,可以使用前台服务。这种模式通常在音乐播放器应用中使用,在用户锁定屏幕后,您仍然可以在后台听到音乐,因为应用程序仍在后台运行。

但是,如果您仍然想使用 RxJava 解决您的问题,可以使用 Subject。将下载进度保存在 Subject 上,需要继续下载时,只需再次发出可观察对象即可。


在Android中,如果您希望后台任务即使Activity死亡仍然存在,则可以使用Service。但是在AsynkTask中,我们确实有这个选项,使用“AsyncTask.cancel(true);”。这就是为什么我正在寻找Rx中的任何等效选项的原因。 - user4489210
AsyncTask.cancel(true)并不能立即取消您的任务,具体实现取决于您自己。您仍然需要定期检查isCancelled并在其被取消时取消您的任务。 - aldok
我的意思是 AsyncTask.cancel(false); 选项,如果你使用这个 false 选项,正在进行的任务将被允许完成,对吗? - user4489210
抱歉,但我们为什么要谈论AsyncTask? - aldok
我只是在指出AsynkTask的一个特性,这正是我想使用Rx来实现的。 - user4489210

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接