通过socket数据传递过来后,使用rxjava处理数据,并传递到应用层
/**
* Socket数据已经传过来了,这步处理数据
*/
public void query(final String json, final QueryDataCallback callback) {
/*
RxJava 支持线程调度,能将操作切换到其它线程
Schedulers.immediate():当前线程
Schedulers.newThread():新线程
Schedulers.io() :I/O 操作的线程(线程无限的内部线程池)
Schedulers.computation() :计算线程(大小为 CPU 数的内部线程池)
AndroidSchedulers.mainThread():Android 的主线程
*/
Observable.unsafeCreate(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
// 调用其 onStart() 方法,初始化数据或者做一些准备
subscriber.onStart();
// 调用 onNext 方法,当被观察者状态变化(即发送数据)
subscriber.onNext(json);
// 调用 onCompleted() 方法
subscriber.onCompleted();
}
})
// 这里将被观察者(即 Socket 通信)放到子线程
.subscribeOn(Schedulers.io())
// 将观察者(即响应事件)切换到计算线程
.observeOn(Schedulers.computation())
// 因为 onNext() 进行事件响应时是传入的 String 类型的 json 字符串
// map() 方法实现了一个 Funcl 的匿名内部类
// 其构造方法有两个参数,第一个参数代表要转换的,第二个代表转换成的
// 所以这里我们先将 String 转换成 ImageBean 类型
.map(new Func1<String, InfoBean>() {
@Override
public InfoBean call(String s) {
// 使用 Gson 将 json 字符串转换为 Bean 的对象
Gson gson = new Gson();
InfoBean bean = gson.fromJson(s, InfoBean.class);
return bean;
}
})
// 将观察者切换到 Android 主线程
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<InfoBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.onFailed();
}
@Override
public void onNext(InfoBean infoBean) {
callback.onSuccess(infoBean);
}
});
}
/**
* 回调信息
*/
public interface QueryDataCallback {
/**
* 成功
*
* @param T 提交返回后的提示参数
*/
<T> void onSuccess(T responseData);
/**
* 失败
*/
void onFailed();
}