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

时间:2017-01-18 05:41:52

标签: android rx-java rx-android

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

我可以看到,如果我在图像下载过程中退出活动,后台任务也会被杀死。我只想继续执行背景任务,即使我已从观察员那里取消订阅。可能吗?

1 个答案:

答案 0 :(得分:0)

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

但后台服务还不够,Android不保证你的应用程序在后台运行时不会被杀死。伊恩湖在his blog post中很好地解释了它。

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

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