【问题标题】:RxJava - How to continue background task after unsubscribing from observableRxJava - 如何在取消订阅 observable 后继续后台任务
【发布时间】:2017-01-18 05:41:51
【问题描述】:

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

在活动的onDestroy 上,我取消订阅 observable 以避免内存泄漏。

  @Override
protected void onDestroy() {
    mSubscription.unsubscribe();
    super.onDestroy();
}

我可以看到,如果我在图像下载过程中退出活动,后台任务也会被杀死。我只想继续背景任务,即使我已经取消了观察者的订阅。是否可以?

【问题讨论】:

  • 如果你取消订阅你的 observable,你不能这样做

标签: android rx-java rx-android


【解决方案1】:

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

但后台服务还不够,Android 不保证您的应用在后台运行时不会被杀死。 Ian Lake 在his blog post 中很好地解释了它。

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

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

【讨论】:

  • 好的。 In Android if you want your background task to exist even after Activity dies you can use Service 。但是在 AsynkTask 中,我们确实有一个选项,使用 AsyncTask.cancel(true); 这就是为什么我在 Rx 中搜索任何等效选项
  • AsyncTask.cancel(true) 不会立即取消您的任务,具体实施由您自己决定。您仍然需要定期检查 isCancelled 并在任务被取消时取消它。
  • 我的意思是AsyncTask.cancel(false);选项,如果你使用这个false选项,正在进行的任务是允许完成的吧?
  • 对不起,我们为什么要讨论 AsyncTask?
  • 我只是指出了 AsynkTask 的一个特性,这正是我想要使用 Rx 实现的目标
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多