说明

对于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(); 
 
} 
 
 }

----------------------------------------------------------------————


亲,如果对你有帮助请点个赞哦~