android开源框架android-async-http
这个很不错的第三方开源类库,针对Android开发中发送http请求的。
它的网络请求自动在非UI线程里执行,你不需要任何额外的操作(比如手动new一个Thread之类)。项目的官方网站:
http://loopj.com/android-async-http/,对应的github地址:https://github.com/loopj/android-async-http
它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求
全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在
Service中或者后台线程中,库代码会自动识别出它所运行的context。其特性包括:
1. 发送异步http请求,在匿名callback对象中处理response;
2. http请求发生在UI线程之外;
3. 内部采用线程池来处理并发请求;
4. GET/POST 参数构造,通过RequestParams类。
5. 内置多部分文件上传,不需要第三方库支持;
6. 流式Json上传,不需要额外的库;
7. 能处理环行和相对重定向;
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
10. 自动的gzip响应解码;
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
14. 支持SAX解析器;
15. 支持各种语言和content编码,不仅仅是UTF-8。
1. 创建一个AsyncHttpClient;
2. (可选的)通过RequestParams对象设置请求参数;
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
代码示例:
1 import com.loopj.android.http.*; 2 3 public class TwitterRestClient { 4 private static final String BASE_URL = "http://api.twitter.com/1/"; 5 6 private static AsyncHttpClient client = new AsyncHttpClient(); 7 8 public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 9 client.get(getAbsoluteUrl(url), params, responseHandler); 10 } 11 12 public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 13 client.post(getAbsoluteUrl(url), params, responseHandler); 14 } 15 16 private static String getAbsoluteUrl(String relativeUrl) { 17 return BASE_URL + relativeUrl; 18 } 19 }
1 import org.json.*; 2 import com.loopj.android.http.*; 3 4 class TwitterRestClientUsage { 5 public void getPublicTimeline() throws JSONException { 6 TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() { 7 @Override 8 public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 9 // If the response is JSONObject instead of expected JSONArray 10 } 11 12 @Override 13 public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) { 14 // Pull out the first event on the public timeline 15 JSONObject firstEvent = timeline.get(0); 16 String tweetText = firstEvent.getString("text"); 17 18 // Do something with the response 19 System.out.println(tweetText); 20 } 21 }); 22 } 23 }