Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
393 views
in Technique[技术] by (71.8m points)

Android RxJava & Retrofit

请问我该如何等待网络请求完成后再进行return?

public class InsertRemain {  
  
    private static Double remain;  
  
 public static Double InsertRemain(String uname, String assetsType) {  
        AssetsPresenter.queryAssRemain(new Subscriber<List<AssetsEntity>>() {  
            @Override  
 public void onCompleted() {  
  
            }  
  
            @Override  
 public void onError(Throwable e) {  
  
            }  
  
            @Override  
 public void onNext(List<AssetsEntity> assetsEntities) {  
        remain = assetsEntities.get(0).getMoneyRemain();  
 }  
     }, uname, assetsType);  
 return remain;  
 }  
}

网络接口

@FormUrlEncoded  
@POST("assets/queryAssRemain")  
Observable<HttpResult<List<AssetsEntity>>> queryAssRemain(@Field("uname") String uname,@Field("assetsType") String assetsType);
public static void queryAssRemain(Subscriber<List<AssetsEntity>> subscriber, String uname, String assetsType) {  
    Observable<List<AssetsEntity>> observable = assetsService.queryAssRemain(uname,assetsType)  
            .map(new HttpResultFunc<List<AssetsEntity>>());  
 toSubscribeAsync(observable, subscriber);  
}
public abstract class ProgressDialogSubscriber<T> extends Subscriber<T> {  
  
    private static final String TAG = "ProgressDialog";  
 private Context mContext;  
 private ProgressDialog mDialog;  
  
 public ProgressDialogSubscriber(Context context){  
        this.mContext=context;  
 }  
  
    @Override  
 public void onNext(T t) {  
        Log.i(TAG, "===============进入onNext" + t);  
 }  
  
    @Override  
 public void onCompleted() {  
        dismissProgressDialog();  
 }  
  
    @Override  
 public void onError(Throwable e) {  
        Log.i(TAG, "===============onError====" + e);  
 if(e instanceof SocketTimeoutException){  
            Toast.makeText(mContext,"网络中断,请检查你的网络状态",Toast.LENGTH_SHORT).show();  
 }else if (e instanceof ConnectException){  
            Toast.makeText(mContext,"网络中断,请检查你的网络状态",Toast.LENGTH_SHORT).show();  
 }else {  
            Toast.makeText(mContext,"error"+e.getMessage(),Toast.LENGTH_SHORT).show();  
 Log.v("=====","error:==="+e.getMessage());  
 }  
        dismissProgressDialog();  
 }  
  
    @Override  
 public void onStart() {  
        showProgressDialog();  
 }  
  
  
    private void showProgressDialog(){  
        if (mDialog!=null){  
            mDialog=new ProgressDialog(mContext);  
 mDialog.setCancelable(true);  
 mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {  
                @Override  
 public void onCancel(DialogInterface dialog) {  
                    //取消订阅,取消请求  
 ProgressDialogSubscriber.this.unsubscribe();  
 }  
            });  
 }  
  
        if (mDialog!=null&&mDialog.isShowing()){  
            mDialog.show();  
 }  
    }  
  
        private void dismissProgressDialog(){  
        if (mDialog!=null&&mDialog.isShowing()){  
            mDialog.dismiss();  
 mDialog=null;  
 }  
        }  
  
  
  
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
RxJava + Retrofit封装了个寂寞……封装前,还是熟读下资料吧

推荐入门资料:干货集中营:给 Android 开发者的 RxJava 详解

RxJava 到底是什么

一个词:异步

RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。

然而,对于初学者来说,这太难看懂了。因为它是一个『总结』,而初学者更需要一个『引言』。

其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。

可见,RxJava的特点就是:异步、链式调用。要求异步调用,同步返回结果,这是很勉强的。但是如果非要这么做,RxJava也是可以的,可以找下名为block的函数调用。

参考资料:

  1. Android RxJava and Retrofit
  2. Using Retrofit and RxJava to fetch data from a REST API

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...