zoukankan      html  css  js  c++  java
  • RxJava异步请求加载状态控制

    在我看来,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>
    这样,一个控制加载状态的功能就写完了.

     

  • 相关阅读:
    c# 生成、读取xml
    http长连接与短连接
    p.net 子页面刷新父页面,页面自动刷新方法汇总
    遍历页面上所有控件
    从数据库导入到Excel表格(同时传四个表的数据到一个Excel中)
    .net海量数据分页通用存储过程
    SQL大数据量分页存储过程效率测试
    给一个接口传递参数,并接收返回的参数
    在asp.net中长内容自动分页的实现.NET教程
    GridView72般技巧
  • 原文地址:https://www.cnblogs.com/fuyaozhishang/p/8119530.html
Copyright © 2011-2022 走看看