广告
返回顶部
首页 > 资讯 > 移动开发 >android使用RxJava实现预加载
  • 908
分享到

android使用RxJava实现预加载

rxjava预加载Android 2022-06-06 04:06:25 908人浏览 薄情痞子
摘要

在上一篇文章中介绍了使用非RxJava环境下,使用Handler机制SyncBarrier的特性实现预加载功能的方法。 在RxJava的环境下使用BehaviorSubject

在上一篇文章中介绍了使用非RxJava环境下,使用Handler机制SyncBarrier的特性实现预加载功能的方法。

在RxJava的环境下使用BehaviorSubject的特性来实现也是很方便的。

BehaviorSubject内部会缓存消息流中最近的一个消息, 在后续有Subscriber订阅时,会直接将缓存的消息发送给Subscriber。

RxPreLoader.java封装如下:


import Android.support.annotation.NonNull;
import java.util.LinkedList;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subjects.BehaviorSubject;

public class RxPreLoader<T> {
 private BehaviorSubject<T> subject;
 private Observable<T> observable;
 private Subscription subscription;
 private final LinkedList<Subscription> allObserver = new LinkedList<>();
 private RxPreLoader(Observable<T> observable) {
 //注意的是由于onCompleted也是数据流中的一个
 //如果直接observer.subscribeOn(Schedulers.io()).subscribe(subject);
 //会导致subject只能缓存onCompleted
 //所以此处新建一个OnSubscribe,通过调用subject.onNext(t)的方式来缓存数据
 this.observable = observable;
 subject = BehaviorSubject.create();
 subscription = Observable.create(new Observable.OnSubscribe<T>() {
  @Override
  public void call(Subscriber<? super T> subscriber) {
  perfORMLoad();
  }
 })
 .subscribeOn(Schedulers.io())
 .subscribe(subject);
 }
 public static <R> RxPreLoader<R> preLoad(@NonNull Observable<R> observable) {
 return new RxPreLoader<R>(observable);
 }
 public void reload() {
 performLoad();
 }
 public Subscription get(Observer<T> observer) {
 Subscription subscription = subject.observeOn(AndroidSchedulers.mainThread())
  .subscribe(observer);
 allObserver.add(subscription);
 return subscription;
 }
 private void performLoad() {
 observable.subscribeOn(Schedulers.io())
  .subscribe(new Action1<T>() {
   @Override
   public void call(T t) {
   if (subject != null) {
    subject.onNext(t);
   }
   }
  }, new Action1<Throwable>() {
   @Override
   public void call(Throwable throwable) {
   throwable.printStackTrace();
   }
  });
 }
 public void destroy() {
 synchronized (allObserver) {
  while(!allObserver.isEmpty()) {
  unsubscribe(allObserver.removeFirst());
  }
 }
 unsubscribe(subscription);
 subscription = null;
 subject = null;
 }
 private void unsubscribe(Subscription subscription) {
 if (subscription != null && !subscription.isUnsubscribed()) {
  subscription.unsubscribe();
 }
 }
}

在activity中使用:


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscriber;

public class RxPreLoaderActivity extends AppCompatActivity {
 private TextView textView;
 private RxPreLoader<String> preLoader;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 preLoad();//启动预加载
 initLayout(savedInstanceState);
 preLoader.get(observer);//展示预加载的数据
 }
 //初始化布局
 private void initLayout(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 setTitle("使用RxPreLoader");
 //通过循环多次findById来模拟复杂页面布局初始化的耗时
 textView = (TextView)findViewById(R.id.textView);
 }
 //展示预加载的数据
 Subscriber<String> observer = new Subscriber<String>() {
 @Override public void onCompleted() { }
 @Override public void onError(Throwable e) {
  e.printStackTrace();
 }
 @Override
 public void onNext(String s) {
  textView.setText(s);
 }
 };
 private void preLoad() {
 preLoader = RxPreLoader.preLoad(Observable.just("result").delay(500, TimeUnit.MILLISECONDS));
 }
 @Override
 protected void onDestroy() {
 super.onDestroy();
 preLoader.destroy();//销毁
 }
}

最后,附上源码Http://xiazai.jb51.net/201701/yuanma/RxPreLoader(jb51.net).rar

您可能感兴趣的文章:Android RxJava创建操作符IntervalAndroid中的Retrofit+OkHttp+RxJava缓存架构使用Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解RxJava入门指南及其在Android开发中的使用示例Android中通过RxJava进行响应式程序设计的入门指南Android上传多张图片的实例代码(RxJava异步分发)Android中用RxJava和ViewPager实现轮播图Android Retrofit和Rxjava的网络请求RxJava两步打造华丽的Android引导页Android RxJava创建操作符Timer的方法


--结束END--

本文标题: android使用RxJava实现预加载

本文链接: https://www.lsjlt.com/news/22516.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android使用RxJava实现预加载
    在上一篇文章中介绍了使用非RxJava环境下,使用Handler机制SyncBarrier的特性实现预加载功能的方法。 在RxJava的环境下使用BehaviorSubject...
    99+
    2022-06-06
    rxjava 预加载 Android
  • android非RxJava环境下使用Handler实现预加载
    在进行Android客户端界面开发时,我们常常会需要将从服务端获取的数据展示到页面布局上,由于数据显示到布局的前置条件是页面布局已初始化完成,否则会出现空指针异常,所以一般我们...
    99+
    2022-06-06
    rxjava 预加载 handler Android
  • android预加载效果怎么实现
    实现Android预加载效果可以使用以下几种方法:1. 使用AsyncTask:在Activity或Fragment中创建一个Asy...
    99+
    2023-08-17
    android
  • android预加载布局怎么使用
    在Android中,可以使用以下方法来预加载布局:1. 使用`LayoutInflater`类的`inflate()`方法手动加载布...
    99+
    2023-10-09
    android
  • android开发中使用Handler怎么实现预加载功能
    这篇文章将为大家详细讲解有关android开发中使用Handler怎么实现预加载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在进行Android客户端界面开发时,我们常常会需要将从服务...
    99+
    2023-05-31
    android handler roi
  • javascript实现图片预加载和懒加载
    本文实例为大家分享了javascript实现图片预加载和懒加载的具体代码,供大家参考,具体内容如下 预加载 预加载是预先加载好后面需要用到的资源, 后面使用的时候直接去缓存里取。举个...
    99+
    2022-11-11
  • webpack如何实现懒加载和预加载
    小编给大家分享一下webpack如何实现懒加载和预加载,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!正常加载为了看的方便,index.js中的代码非常简单console.log('index.js执行了')...
    99+
    2023-06-22
  • 如何使用require.context实现优雅的预加载
    目录前言丑陋的预加载单张预加载多张预加载优雅的预加载require.context前言 在前端开发中,对页面花里胡哨度[注1]要求越高的页面,用到的图片、音频什么的就越多,比如什么结...
    99+
    2023-05-19
    require.context预加载 require.context使用
  • JS如何实现图片预加载之无序预加载功能
    这篇文章主要介绍JS如何实现图片预加载之无序预加载功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!图片预加载之无序预加载的效果图如下所示,如果大家感觉不错,请参考实现代码。具体代码...
    99+
    2022-10-19
  • Android中用RxJava和ViewPager实现轮播图
    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果。但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完...
    99+
    2022-06-06
    rxjava 轮播图 viewpager 轮播 Android
  • WordPress怎么实现HTML5预加载
    小编给大家分享一下WordPress怎么实现HTML5预加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  HTM...
    99+
    2022-10-19
  • Flutter WebView预加载如何实现
    本文小编为大家详细介绍“Flutter WebView预加载如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Flutter WebView预加载如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-30
  • Android实现加载圈
    开发过程中经常用到加载圈,特别是车机开发由于外设不同很多操作响应的等待时长经常要用到不同的加载圈。 首先,直接上菊花效果图,这是我直接从项目里面截取下来的。 核心代码 import...
    99+
    2022-11-13
  • JavaScript懒加载与预加载原理与实现详解
    目录1、懒加载1.1、什么是懒加载1.2、为什么要使用懒加载1.3、懒加载的优点1.4、懒加载的原理1.5、懒加载的实现步骤1.6、懒加载的实现方式2、预加载2.1、什么是预加载2....
    99+
    2022-11-13
  • javascript如何实现图片预加载和懒加载功能
    这篇文章主要介绍“javascript如何实现图片预加载和懒加载功能”,在日常操作中,相信很多人在javascript如何实现图片预加载和懒加载功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascr...
    99+
    2023-06-14
  • PHP7.4中怎么实现预加载方法
    这篇文章将为大家详细讲解有关PHP7.4中怎么实现预加载方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言PHP 7.4增加了预加载支持,这一功能可以显...
    99+
    2022-10-18
  • Flutter WebView 预加载实现方法(Http Server)
    目录背景分析HttpServer接下来?资源配置下载解压与本地存储版本管理与更新获取LocalServer Url并加载Webview兜底措施统一管理展示与分析总结Demo背景 We...
    99+
    2022-11-13
  • Android如何实现加载圈
    这篇文章主要介绍“Android如何实现加载圈”,在日常操作中,相信很多人在Android如何实现加载圈问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android如何实现加载圈”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-02
  • 如何使用jQuery预加载图片
    这篇文章主要介绍了如何使用jQuery预加载图片,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用jQuery预加载图片jQuery.preloadImages =...
    99+
    2023-06-27
  • 小程序如何实现图片预加载
    这篇文章主要为大家展示了“小程序如何实现图片预加载”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现图片预加载”这篇文章吧。    网页有页面预加载,小程序也有图片预加载,小程序图片加...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作