Android实现Rxjava2+Retrofit完美封装( 三 )

五.处理加载Loading
关于Loading我们可以通过RxJava的compose操作符来做一个非常优雅的处理 。首先定义一个ProgressUtils工具类,然后通过RxJava的ObservableTransformer做一个变换来处理Loading 。想要显示Loading,只需要加上.compose(ProgressUtils.< T >applyProgressBar(this))即可 。
ProgressUtils代码如下:
public class ProgressUtils { public static <T> ObservableTransformer<T, T> applyProgressBar( @NonNull final Activity activity, String msg) { final WeakReference<Activity> activityWeakReference = new WeakReference<>(activity); final DialogUtils dialogUtils = new DialogUtils(); dialogUtils.showProgress(activityWeakReference.get()); return new ObservableTransformer<T, T>() { @Override public ObservableSource<T> apply(Observable<T> upstream) { return upstream.doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { } }).doOnTerminate(new Action() { @Override public void run() throws Exception { Activity context; if ((context = activityWeakReference.get()) != null && !context.isFinishing()) { dialogUtils.dismissProgress(); } } }).doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { /*Activity context; if ((context = activityWeakReference.get()) != null && !context.isFinishing()) { dialogUtils.dismissProgress(); }*/ } }); } }; } public static <T> ObservableTransformer<T, T> applyProgressBar( @NonNull final Activity activity) { return applyProgressBar(activity, ""); }}至此关于RxJava和Retrofit的二次封装已经基本完成 。但是我们不能忽略了很重要的一点,就是网络请求的生命周期 。我们将在下一节中详细讲解 。
## 六、管理Retrofit生命周期
当activity被销毁时,网络请求也应该随之终止的 。要不然就可能造成内存泄漏 。会严重影到响App的性能!因此Retrofit生命周期的管理也是比较重要的一点内容 。在这里我们使用 RxLifecycle来对Retrofit进行生命周期管理 。其使用流程如下:
1.在gradel中添加依赖如下:
compile 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'2.让我们的BaseActivity继承RxAppCompatActivity 。
具体代码如下:
public abstract class BaseActivity extends RxAppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); init(savedInstanceState); } protected void showToast(String msg) { ToastUtils.show(msg); } protected abstract @LayoutRes int getLayoutId(); protected abstract void init(Bundle savedInstanceState);}同样我们项目的BaseFragment继承RxFragment(注意使用继承V4包下的RxFragment),如下:
public abstract class BaseFragment extends RxFragment { public View rootView; public LayoutInflater inflater; @Nullable @Override public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); this.inflater = inflater; if (rootView == null) { rootView = inflater.inflate(this.getLayoutId(), container, false); init(savedInstanceState); } ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); } return rootView; } protected abstract int getLayoutId(); protected abstract void init(Bundle savedInstanceState); protected void showToast(String msg) { ToastUtils.show(msg); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); }}3.使用compose操作符管理Retrofit生命周期了:
myObservable .compose(bindToLifecycle()) .subscribe();或者myObservable .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) .subscribe();关于RxLifecycle的详细使用方法可以参考 RxLifecycle官网
七.如何使用封装
前面几节内容讲解了如何RxJava进行二次封装,封装部分的代码可以放在我们项目的Library模块中 。那么封装好之后我们应该如何在app模块中使用呢?
1.定义一个接口来存放我们项目的API
public interface IdeaApiService { /** * 此接口服务器响应数据BasicResponse的泛型T应该是List<MeiZi> * 即BasicResponse<List<MeiZi>> * @return BasicResponse<List<MeiZi>> */ @Headers("Cache-Control: public, max-age=10")//设置缓存 缓存时间为100s @GET("福利/10/1") Observable<List<MeiZi>> getMezi(); /** * 登录 接口为假接口 并不能返回数据 * @return */ @POST("login.do") Observable<LoginResponse> login(@Body LoginRequest request); /** * 刷新token 接口为假接口 并不能返回数据 * @return */ @POST("refresh_token.do") Observable<RefreshTokenResponseBean> refreshToken(@Body RefreshTokenRequest request); @Multipart @POST("upload/uploadFile.do") Observable<BasicResponse> uploadFiles(@Part List<MultipartBody.Part> partList);}


推荐阅读