RxJava異步請求加載狀態控制

在我看來,RxJava最大的特色就是異步,不管你是解析複雜的數據或是IO操做,咱們均可以利用它內置的線程池進行線程間的調度,簡單的使用java

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

這種操做就能夠指定操做在你想要的線程裏執行.android

固然,網絡請求這種耗時的操做確定也是要放在子線程執行的,那麼是異步操做,咱們就會有等待時間,安卓裏一般的作法是在界面上蓋一個加載中的loading;等操做完成,切換到UI線程時,咱們再把它隱藏起來.網絡

因而有app

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裏的實現ide

@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.xmlspa

<?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>
這樣,一個控制加載狀態的功能就寫完了.
相關文章
相關標籤/搜索