RxJava结合ProgressDialog实现请求数据
2016-05-02 14:24
489 查看
先看效果图
接下来看代码
1.请求接口
2.ProgressHandler
3.ProgressSubscribe
4.RetrofitClient
5.SubscribeOnNextListener
6.ProgressCancelListener
7.MainActivity
接下来看代码
1.请求接口
public interface MovieService { // @GET("top250")//https://api.douban.com/v2/movie/top250?start=0&count=10 // Call<MovieInfo> getMovieInfo(@Query("start") int start, @Query("count") int count); // @GET("top250") // rx.Observable<MovieInfo> getMovieInfo2(@Query("start") int start, @Query("count") int count); @GET("top250") Observable<HttpResult<List<MovieInfo.SubjectsBean>>> getMovieInfo3(@Query("start") int start, @Query("count") int count); }
2.ProgressHandler
public class ProgressHandler extends Handler { public static final int SHOW_PROGRESS = 0; public static final int DISMISS_PROGRESS = 1; private ProgressDialog pd; private Context mContext; private ProgressCancelListener mProgressCancelListener; private boolean cancelable; public ProgressHandler(Context context, ProgressCancelListener listener,boolean cancelable){ this.mContext = context; mProgressCancelListener = listener; this.cancelable = cancelable; } public void initProgressDialog(){ if(pd == null){ pd = new ProgressDialog(mContext); pd.setCancelable(cancelable); if(cancelable){ pd.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { mProgressCancelListener.onProgressCanceled(); } }); } if(!pd.isShowing()){ pd.show();//显示进度条 } } } public void dismissProgressDialog(){ if(pd!=null){ pd.dismiss();//取消进度条 pd = null; } } @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what){ case SHOW_PROGRESS: initProgressDialog(); break; case DISMISS_PROGRESS: dismissProgressDialog(); break; } } }
3.ProgressSubscribe
public class ProgressSubscribe<T> extends Subscriber<T> implements ProgressCancelListener { private SubscribeOnNextListener mOnNextListener; private Context mContext; private ProgressHandler mProgressHandler; public ProgressSubscribe(SubscribeOnNextListener listener, Context context){ this.mOnNextListener = listener; mContext = context; mProgressHandler = new ProgressHandler(mContext,this,true); } public void showProgressDialog(){ if(mProgressHandler!=null){ mProgressHandler.obtainMessage(ProgressHandler.SHOW_PROGRESS).sendToTarget(); } } public void disMissProgressDialog(){ if(mProgressHandler!=null){ mProgressHandler.obtainMessage(ProgressHandler.DISMISS_PROGRESS).sendToTarget(); mProgressHandler = null; } } @Override public void onStart() { super.onStart(); showProgressDialog(); } @Override public void onCompleted() { disMissProgressDialog(); } @Override public void onError(Throwable e) { disMissProgressDialog(); } @Override public void onNext(Object o) { mOnNextListener.onNext(o);//回调MainActivity中的onNext方法 } @Override public void onProgressCanceled() {//取消请求 if(!this.isUnsubscribed()){ unsubscribe(); } } }
4.RetrofitClient
public class RetrofitClient { private Retrofit mRetrofit; private final MovieService mMovieService; public RetrofitClient(){ mRetrofit = new Retrofit.Builder().baseUrl("https://api.douban.com/v2/movie/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); mMovieService = mRetrofit.create(MovieService.class); } public static RetrofitClient getInstance(){ return RetrofitHolder.sClient; } public static class RetrofitHolder{ private static RetrofitClient sClient = new RetrofitClient(); } public<T> T create(Class<T> clazz){ return mRetrofit.create(clazz); } // public void getMovieInfo(Subscriber<MovieInfo> subscriber,int start,int count){ // mMovieService.getMovieInfo2(start,count) // .subscribeOn(Schedulers.io()) // .observeOn(AndroidSchedulers.mainThread()) // .subscribe(subscriber); // } /** * 用来统一处理Htpp的resultCode,并将data部分的数据剥离出来给Subscriber * @param <T> Subscribe真正需要的数据类型 */ class HttpResultFunc<T> implements Func1<HttpResult<T>,T>{ @Override public T call(HttpResult<T> tHttpResult) { if(tHttpResult.resultCode!=0){ // throw new ApiException } return tHttpResult.subjects; } } public void getMovieInfo(Subscriber<List<MovieInfo.SubjectsBean>> subscriber, int start, int count){ mMovieService.getMovieInfo3(start,count) .map(new HttpResultFunc<List<MovieInfo.SubjectsBean>>()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); } }
5.SubscribeOnNextListener
//接口,用来回调 public interface SubscribeOnNextListener<T> { void onNext(T t); }
6.ProgressCancelListener
//接口,用来取消进度条 public interface ProgressCancelListener { void onProgressCanceled(); }
7.MainActivity
public class MainActivity extends AppCompatActivity { @Bind(R.id.textview) TextView mTextview; @Bind(R.id.button) Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.id.button) public void click() { getMovie(); } public void getMovie() { RetrofitClient.getInstance().getMovieInfo (new ProgressSubscribe<List<MovieInfo.SubjectsBean>>(mOnNextListener,this),0,10); } SubscribeOnNextListener<List<MovieInfo.SubjectsBean>> mOnNextListener = new SubscribeOnNextListener<List<MovieInfo.SubjectsBean>>() { @Override public void onNext(List<MovieInfo.SubjectsBean> o) { mTextview.setText(o.toString()); } }; }
相关文章推荐
- java构造类
- Part 1 Understanding Java Garbage Collection
- 第4章 控制执行流程
- eclipse创建maven模块工程
- Java本地文件操作(二)文件夹的创建、删除、重命名
- java权限修饰符
- 码农小汪-Spring MVC url路径,请求方法限定
- 9.2 JavaScritp:为数据带来生命-数组对象
- java中的线程问题
- SpringMVC访问静态资源的三种方式
- org.springframework.beans.factory.NoUniqueBeanDefinitionException
- Java 线程局部存储
- java并发编程(6)--synchronized
- SpringData 学习(4)—— 使用 @Query 注解实现查询
- java数组排序,二分查找
- java中几种复制数组的方法比较
- Java本地文件操作(一)文件的创建、删除、重命名
- JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
- [JAVA · 初级]:25.从整体理解J2SE
- [JAVA · 初级]:24.偶识【正则表达式】[1]