教你怎么写网络异步同步请求回调
最近需要用到请求网络数据,在网上一直查找,都找不到,要么是说的不明白,之后我自己动手来实现了。
网络回调,分为同步和异步,多数情况都会用异步,但是也有情况用到同步的。
无论同步异步,都必须要在子线程中去加载。
首先写一个写一个网络请求接口。
同步网络请求这里就说了,同步就是一直等待,等待他完成为止(有无结果)
异步请求的回调才是我们要学习的重点
比较有规范的通用回调接口
class ResultCallback:
public interface ResultCallback {
void getReslt(String result);
}
请求网络的接口
public class SongsProtocol extends BaseProtocol {
public static void parse(String id, ResultCallback callback) {
final RequestParams params = new RequestParams(HttpUrl.MUSICIANS_SONGS + id + "?type=yc|fc|bz&page="
+ SongsAdapter.page);
resultCallback = callback;//实例化
------------------------------------------------------------------------
x.http().get(params, new Callback.CommonCallback<String>() {
Message message = new Message();
@Override
public void onSuccess(String result) {
message.what = 0;
message.obj = result;
myHandler.sendMessage(message);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
message.what = 1;
myHandler.sendMessage(message);
MyToast.show("加载错误,请稍后重试");
}
@Override
public void onCancelled(Callback.CancelledException cex) {
MyToast.show("加载取消,请稍后重试");
}
@Override
public void onFinished() {
}
});
//注意虚线之间的,我这里用xutils 3.0 这个是异步的,或者其他框架。当然你也可以用JAVA那个
--------------------------------------------------------------------------
}
public static Handler myHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
resultCallback.getReslt("");
} else if (msg.what == 0) {
String result = (String) msg.obj;
resultCallback.getReslt(result);
}
}
;
};
//声明抽象接口的变量
static ResultCallback resultCallback = new ResultCallback() {
@Override
public void getReslt(String result) {
// TODO Auto-generated method stub
}
};
}
在Activity中调用。
声明 callback
ResultCallback callback = new ResultCallback() {
@Override
public void getReslt(String result) {
if (result.isEmpty()) {
return;
}
Gson gson = new Gson();
MusiciansSongs bean = gson.fromJson(result, MusiciansSongs.class);
if ("200".equals(bean.getCode())) {
datas = bean.getData().getList();
if (bean.getData().getList().size() != 0) {
datas = bean.getData().getList();
SongsAdapter.page++;
LogUtils.e("songs protocol" + datas.toString());
} else {
Toast.show("没有更多数据");
}
} else {
Toast.show("请稍后重试");
}
}
};
//调用
SongsProtocol.parse(id, callback);
速度非常快,毫无有延迟现象,这样子的难题又被解决了,当然这些代码还可以优雅一点,实现代码的复用。才是砸门追求的。
很简单是吧,也没有要说声明,相信大家都可以看懂。