当前位置: 首页 > 知识库问答 >
问题:

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

澹台镜
2023-03-14

我是RxJava的新手。我有一个bitmap观察,用于下载图像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上,我取消订阅可观察到的以避免内存泄漏。

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

我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

共有1个答案

狄宗清
2023-03-14

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

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

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

然而,如果您仍然想使用RxJava来解决您的问题,那么可以使用Subject。保存主题的下载进度,当您想继续下载时,只需再次发出您的可观察内容。

 类似资料:
  • 例: 注意:是非Android 运行环境, 使用的是RxJava2.x

  • 我只是把我的脚趾头浸入RxJava中,所以请温柔点:)到今天为止,我对异步任务还可以,但它变得越来越复杂,我想我终于偶然发现了一个需求,实际上我很难用简单的异步任务来满足这个需求。这是我的用例: 1)我有一个方法(我们称之为),它需要在会话中运行一次。如果以前运行过,它会返回缓存的响应。否则,它会执行一个网络调用,然后根据结果执行另一个。这两个网络任务都使用OkHttp运行,并且是同步的。方法本身

  • 在这篇文章之后,我正在使用带有RxJava/RxKotlin Flowable的Room。我让它运行,但在带有3个片段的ViewPager中使用它存在问题。 我将向您介绍我的代码: 我有一个带有选项卡布局和三个片段(A、B和收藏夹)的视图分页器。前两个片段包含可以添加到收藏夹的数据列表。 在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是,当一个项目在A和B中成为

  • 我正在创建一个应用程序,其中我从服务器下载一些数据。在后台运行时,我希望连接应该继续运行,以便可以下载数据。我知道在app里有方法 当应用程序进入后台时调用。但由于连接是在viewController中创建的,如何在appDelegate中管理它 还有其他方法可以做到这一点吗?我已经通过了这个链接,但是有一个简单的实现方法吗?

  • 第一,我试过了 第二,我尝试了下面的。(使用onErrorResumeNext),但取消了订阅。 (未调用onError,但调用OnComplete。因此已取消订阅) 第三,我试了下面。(带重试) 这比第一好。但没有刻录。 我想使刷新按钮,工作后错误。 我想知道 null 对不起,我的英语太差了。

  • 在RxJava(或一般的RX)中,是否有任何方法可以组合可观察对象,使生成的可观察对象等待直到每个可观察对象以任何一种方式完成(当其中任何一个抛出错误时不会吓坏),然后完成一个包含有关哪个可观察对象成功完成以及哪个遇到错误的信息的结果? 如果observable成功完成,它还将返回observable的结果;如果observable失败完成,它将返回错误原因(如Throwable实例)? 行为类似