Android异步请求处理实现机制

3 篇文章 0 订阅
2 篇文章 0 订阅

说明

对于Android开发,界面(UI)相关操作智能在主线程中执行,而我们的应用往往要访问网络以获取数据,或者执行一些其他的耗时很长的操作。在主线程(UI)中直接执行长时间的处理,Android平台是不允许的。因此需要使用一种异步机制来处理UI线程和非UI线程之间的交互。

对此,Android提供了Hndler机制以实现非UI线程和UI线程的交互。这是一种消息机制,概念上是这样的:UI 线程创建 Hndler,然后创建子线程(非UI线程),并将handler以传递给子线程相关对象或者方法并启动子线程。子线程执行耗时操作(如获取网络数据),在处理过成功可以向Handler发送消息(消息可以是任何数据),Handler收到消息后,启指定的方法(handleMessage)会被调用,需要注意的是,此方法的调用是在主线程中执行的,因此可以在此执行界面的相关处理。

接口

根据以上原理并参考网络相关资料,谢了一个异步访问网络的类,以供大家分享、提高。注意此类没有处理与session状态相关的内容。使用此类可以执行http GET或者http POST请求,并在请求结束后调用指定的回调方法。类的说明已在注释中写的很详尽了。有什么不好的地方请大家指正。



/**
 * HTTP异步请求辅助类,默认为GET请求,指定 URL 及参数发送异步请求,请求完成调用 ResponseCallback 指定的方法,
 * 有的方法在后台线程中执行,有的方法在调用者线程(通常是UI线程)中执,详细描述如下:
 * 
 * 1 如果请求成功则先调用 handleResult(result)方法,参数为全部响应数据,此方法在后台线程中执行;
 * 
 * 2 handleResult 方法调用完成后,refreshView 方法会被调用,此方法执行在调用者线程(UI)中,通 常用于更显前台视图界面;
 * 
 * 3 如果请求失败,requestFail 方法会被调用,此方法执行在调用者线程(UI)中。
 * 
 */
public class AsyncNetRequest {
private String url = "";
private Context context;
private String submitType = "GET";
private final int REQUEST_SUCCESS = 0;
private final int REQUEST_FAIL = 1;


public AsyncNetRequest(Context context) {
this.context = context;
}


public void setUrl(String url) {
this.url = url;
}


public void setSubmitType(String submitType) {
this.submitType = submitType;
}


/**
* 设定请求参数,及回调对象

* @param params
*            请求参数
* @param callback
*            回调对象
*/
@SuppressLint("HandlerLeak")
public void sendRequest(final List<NameValuePair> params,
final ResponseCallback callback) {
final Handler handler = new Handler() {
public void handleMessage(Message message) {
switch (message.what) {
case REQUEST_SUCCESS:
callback.refreshView();
break;
case REQUEST_FAIL:
callback.requestFail();
break;
}
}
};


new Thread() {
public void run() {
HttpResponse response;
String result = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
if (submitType.equals("POST")) {
HttpPost request = new HttpPost(url);
if (params != null) {
HttpEntity entity = new UrlEncodedFormEntity( params, "UTF-8");
request.setEntity(entity);
}
response = httpClient.execute(request);
} else {
HttpGet request = new HttpGet(url);
response = httpClient.execute(request);
}


if (response.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(response.getEntity());


System.out.println(httpClient.getCookieStore());
Log.i(context.getClass().getName() + "Result", result);
if (result != null) {
callback.handleResult(result);
handler.sendEmptyMessage(REQUEST_SUCCESS);
} else {
handler.sendEmptyMessage(REQUEST_FAIL);
}
} else {
String statusCode = String.valueOf(response.getStatusLine().getStatusCode());
Log.i(context.getClass().getName(), statusCode);
handler.sendEmptyMessage(REQUEST_FAIL);
}
} catch (Exception e) {
handler.sendEmptyMessage(REQUEST_FAIL);
e.printStackTrace();
}
}
}.start();
}


/**
* 异步请求回调对象
*/
public interface ResponseCallback {
/**
* 如果请求成功则先调用 handleResult(result)方法,参数为全部响应数据,此方法在后台线程中执行;

* @param result
*            全部响应数据
*/
public void handleResult(String result);


/**
* 如果请求失败,requestFail 方法会被调用,此方法执行在调用者线程(UI)中。
*/


public void requestFail();


/**
* handleResult 方法调用完成后,refreshView 方法会被调用,此方法执行在调用者线程(UI)中,通
* 常用于更显前台视图界面;
*/
public void refreshView();
}
}
----------------------------------------------------------------————
亲,如果对你有帮助请点个赞哦~


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值