RxJava from 处理list时,其中有一个出错时如何继续发送下面的list内容。


//这是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还是会被发送)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值