//这是LocalTransRecordPresenter.java
//这是LocalTransRecordPresenter.java public class LocalTransRecordPresenter extends Presenter<LocalTransRecordActivity> { public void pQueryFlowInfoByBatchNo2(List<SingleFlowEntity> mSingleFlowEntity) { if (!CheckNetIsOk.isNetOk(getView())) { return; } subscribe2(createUrlObservable2(mSingleFlowEntity)); } private void subscribe2(Observable<TransResponse> observable) { observable.subscribe(new Action1<TransResponse>() { @Override public void call(TransResponse s) { if(s!=null) { JUtils.Log(" ------------------ " + s.MESSAGE + " " + s.STATUS+ s.REMARK); } } }); /* observable.subscribe(new Action1<TransResponse>() { @Override public void call(TransResponse s) { JUtils.Log(" " + s.MESSAGE+" "+s.STATUS); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); JUtils.Log("throwable call()" + throwable.getMessage()); } });*/ } public Observable<TransResponse> createUrlObservable2(List<SingleFlowEntity> mSingleFlowEntity) { return Observable.from(mSingleFlowEntity) .concatMap(new Func1<SingleFlowEntity, Observable<TransResponse>>() { @Override public Observable<TransResponse> call(SingleFlowEntity s) { return createFlowObservableMultiThread(s); } }) /* .onErrorReturn(new Func1<Throwable, TransResponse>() { @Override public TransResponse call(Throwable throwable) { JUtils.Log("在onErrorReturn处理了:" + throwable.toString()); return null; } })*/ .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } private synchronized Observable<TransResponse> createFlowObservableMultiThread(SingleFlowEntity s) { return Observable.create(new Observable.OnSubscribe<TransResponse>() { @Override public void call(Subscriber<? super TransResponse> subscriber) { TransResponse mTransResponse; try{ mTransResponse = LocalTransRecordModel.getInstance().mQueryFlowInfoByBatchno2(s); JUtils.Log("createFlowObservableMultiThread:" + mTransResponse.STATUS + " " + mTransResponse.MESSAGE+" "+mTransResponse.REMARK); subscriber.onNext(mTransResponse); subscriber.onCompleted(); }catch (Exception e){ JUtils.Log("createFlowObservableMultiThread: exception"); subscriber.onCompleted(); } } }); } }
//这是LocalTransRecordModel.java
public TransResponse mQueryFlowInfoByBatchno2(final SingleFlowEntity mSingleFlowEntity ) { JUtils.Log("-------------22----------------"); return ServiceClient.getService().queryTrade2(strEntity); }//这是ServiceClient.java
public class ServiceClient { //读超时长,单位:毫秒 public static final int DEFAULT_TIME_OUT = 12; //连接时长,单位:毫秒 public static final int CONNECT_TIME_OUT = 12; private static Service mService; private static OkHttpClient okHttpClient; public static OkHttpClient getOkHttpClient(){ if (okHttpClient==null){ okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS); okHttpClient.setWriteTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS); } return okHttpClient; } public static Service getService(){ if (mService == null){ createService(); } return mService; } public static void setServiceNull(){ mService = null; } private static void createService(){ mService = createAdapter().create(Service.class); } private static RestAdapter createAdapter(){ // boolean isInDebugServer = JUtils.getSharedPreference().getBoolean("DebugServer",false); IPPORT.getInstance().getIpPort(); return new RestAdapter.Builder() .setEndpoint(IPPORT.getInstance().getIpPort()) /* .setRequestInterceptor(new HeaderInterceptors())*/ .setLogLevel(RestAdapter.LogLevel.FULL ) .setConverter(new WrapperConverter()) .setClient(new OkClient(getOkHttpClient())) /*.setRequestInterceptor(new HeaderInterceptors())*/ .build(); } }
//这是WrapperConverter.java
public class WrapperConverter implements Converter { private static final String CHARSET_DEFAULT = "utf-8"; private static final int BUFFER_SIZE = 0x400; private Gson gson; @Override public Object fromBody(TypedInput body, Type type) throws ConversionException { String result = getString(body); //JUtils.Log("result:"+result); TransResponse transResponse; transResponse = getGson().fromJson(result,TransResponse.class); if(null!=transResponse && API.CODE.SUCCEED.equals(transResponse.STATUS)){ return transResponse; }else{ /*ToastMakeUtils.showToast(TimesCountActivity.this, transResponse != null ? transResponse.MESSAGE : getString(R.string.parse_error));*/ throw new ServiceException( transResponse != null ? transResponse.STATUS:"[", transResponse != null ? transResponse.MESSAGE:"数据解析错误]"); } } }
//这是ServiceException.java
public class ServiceException extends ConversionException { private String status; private String message; public String getStatus() { return status; } public String getInfo() { return message; } public ServiceException(String status, String message) { super("ServiceException status:"+status+" message:"+message); this.status = status; this.message = message; } }
开始分析:
上面包含四个文件。
流程概述:Android activity在调用了 pQueryFlowInfoByBatchNo2() 后经过一系列的调用到 ServiceClient.getService().queryTrade2(strEntity) (Retrofit 访问服务器)。Retrofit这里对服务器返回的信息解析在WrapperConverter.java 中进行。 正常的时候返回TransResponse ,异常的是否抛出ServerException。
在函 数多少createFlowObservableMultiThread 接受到queryTrade2抛出的异常时如果调用subscriber.onCompleted(). 否则默认就调用onError()。如果调用了onError的话,from(list)就不会再发送后面的内容了。(例如{1,2,3,4}: 当2发送错误的时候,3和4就不会再被发送。 而catch了异常后使用onCompleted那么,3和4还是会被发送)