在我看来,RxJava最大的特点就是异步,无论你是解析复杂的数据或是IO操作,我们都可以利用它内置的线程池进行线程间的调度,简单的使用

subscribeOn(Schedulers.io()).doOnNext(...)
observeOn(AndroidSchedulers.mainThread()).doOnNext(...)

这种操作就可以指定操作在你想要的线程里执行.

当然,网络请求这种耗时的操作肯定也是要放在子线程执行的,那么是异步操作,我们就会有等待时间,安卓里通常的做法是在界面上盖一个加载中的loading;等操作完成,切换到UI线程时,我们再把它隐藏起来.

于是有

private final HomeContract.View mView;
retrofit.create(ApiService.class)
.getHomeData(loginCallInfo.getAccessToken(), loginCallInfo.getUserId(), Constants.PLATFORM, Constants.APPLICATIONID, 1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<HomeData>() {
@Override
public void onSubscribe(Disposable d) {
if (!d.isDisposed()) {
mView.setLoadingView();
}
} @Override
public void onNext(HomeData value) {
if (value == null) {
mView.setEmptyView();
} else {
mView.setSuccessView();
...//这里显示正常视图
}
} @Override
public void onError(Throwable t) {
Logger.d(t.getMessage());
mView.setErrorView();
} @Override
public void onComplete() { }
});

在HomeContract.java中

public class HomeContract {

    interface View extends BaseView<Presenter> {

        void setLoadingView();

        void setSuccessView();

        void setErrorView();

        void setEmptyView();
}
}

具体在HomeFragment里的实现

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
savedInstanceState) {
  View root =inflater.inflate(R.layout.fragment_home,container,false);
  progress = (ProgressBar) root.findViewById(R.id.loading);
  fl_excep = (FrameLayout) root.findViewById(R.id.fl_error);
  retry = ((Button) root.findViewById(R.id.btn_retry));
  retry.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Logger.e("正在重试");//重试操作
     }
  });
} @Override
public void setLoadingView() {
if (progress.getVisibility() == View.GONE) {
progress.setVisibility(View.VISIBLE);
}
} @Override
public void setSuccessView() {
if (progress.getVisibility() == View.VISIBLE) {
progress.setVisibility(View.GONE);
}
} @Override
public void setErrorView() {
if (progress.getVisibility() == View.VISIBLE) {
progress.setVisibility(View.GONE);
fl_excep.setVisibility(View.VISIBLE);
retry.setText(R.string.request_err);
}
} @Override
public void setEmptyView() {
if (progress.getVisibility() == View.VISIBLE) {
progress.setVisibility(View.GONE);
fl_excep.setVisibility(View.VISIBLE);
retry.setText(R.string.empty_des);
}
}

最后,看下xml布局

fragment_home.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/translucent">
<--这里是你想显示的正常视图-->
<include layout="@layout/public_loading" />
</FrameLayout>

public_loading.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" /> <FrameLayout
android:id="@+id/fl_error"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"> <Button
android:id="@+id/btn_retry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:text="网络错误,点击重试"
android:textSize="20sp" />
</FrameLayout>
</FrameLayout>
这样,一个控制加载状态的功能就写完了.

RxJava异步请求加载状态控制的更多相关文章

  1. jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据

    jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...

  2. Android高效异步图片加载框架

    概述 Android高效异步图片加载框架:一个高效的异步加载显示的图片加载框架,同时具备图片压缩,缓存机制等特性. 详细 代码下载:http://www.demodashi.com/demo/1214 ...

  3. Echarts 异步数据加载遇到的问题

    看了Echarts官网异步加载数据的Demo var myChart = echarts.init(document.getElementById('main')); // 显示标题,图例和空的坐标轴 ...

  4. js 判断页面加载状态

    //----判断当前页面是否加载状态 开始 ---- document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function ...

  5. echarts异步数据加载(在下拉框选择事件中异步更新数据)

    接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...

  6. OC 异步顺序加载的方法

    方法一:发射信号量 OC -异步顺序加载 先调用A接口,再调用B接口,再调用C接口 dispatch_semaphore_t semaphore = dispatch_semaphore_create ...

  7. 三、js提交请求加载启动动画、请求完成成功回调、注销加载动画

    1.通过Query  post方式进行异步请求方法 jQuery.post(url, [data], [callback], [type]) 参数说明: url:发送请求地址 data:待发送 Key ...

  8. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  9. javascript 异步模块加载 简易实现

    在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...

随机推荐

  1. 剑指offer-二叉查找树的第 K 个结点

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...

  2. 深度学习应用系列(一)| 在Ubuntu 18.04安装tensorflow 1.10 GPU版本

    tensorflow目前已经升级至r1.10版本.在之前的深度学习中,我是在MAC的虚拟机上跑CPU版本的tensorflow程序,当数据量变大后,tensorflow跑的非常慢,在内存不足情况下,又 ...

  3. coreseek 段错误 (core dumped) 问题

    coreseek建立索引出现上面问题经过测试发现有下面几个原因: 1. 分词配置文件不存在  uni.lib 2. uni.lib配置文件格式不正确

  4. 【UOJ #171】【WC 2016】挑战NPC

    http://uoj.ac/problem/171 带花树开花时的u和v一定要记清楚顺序,想好了再写,数据范围也要算好! 对每个筐子拆成3个点,连成一个三元环,对每个(u,v),让u和v的3个点都连边 ...

  5. 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique

    给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...

  6. 【并查集】Gym - 101128B - Black Vienna

    有26张牌(A~Z),其中三张被拿走了.其余23张被分发给了两个人.给你m次调查结果,一次调查结果是对其中一个人询问一对牌,他会告诉你他有这对牌的几张(0~2).问你有多少种被拿走的牌的组合. 三重循 ...

  7. (疯狂java)第四课(上)

    趁着周末玩爽了,兴致来了,继续玩玩java(估计再玩下去,就要被java玩了),第六章实在是很长,那就两个阶段来看吧. 1.java 7的增强包装类 这些包装类就是java上的基本类型,只不过人人基本 ...

  8. python基础之模块,面向对象

    hash 什么是hash? hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 为何用hash? hash值有三大特性: 1.只要传入的内容一样,得到的hash值必然一样 2.只要使 ...

  9. Problem B: 输入3个字符串,按由小到大顺序输出

    #include<stdio.h> #include<string.h> int main() { ],b[],c[],t[]; while(gets(a)!=NULL) { ...

  10. redis源码解析之事件驱动

    Redis 内部有个小型的事件驱动,它主要处理两项任务: 文件事件:使用I/O多路复用技术处理多个客户端请求,并返回执行结果. 时间事件:维护服务器的资源管理,状态检查. 主要的数据结构包括文件事件结 ...