AsyncHttpClient
1.在很多时候android都需要进行网络的操作,而android自带的HttpClient可以实现,但要进行很多网络连接的时候(如:下载很多图片),就需要线程池来进行管理,但默认都是阻塞式操作。这种模型效率不高,对并发要求高的
APP 来讲,并不适用,要用AsyncHttpClient 就必须下载一个jar包
------>> 下载地址。
2.AsyncHttpClient框架是异步的框架,而且已经封装好了了线程池的操作。所以对网络的操作都是很快的!
3.在AsyncHttpClient框架中主要的类如下:
主要用到的类有AsyncHttpClient ,
JsonHttpResponseHandler , RequestParams,
3.请求的方法:
AsyncHttpClient.post(arg0,arg1,arg2);
arg0:是你post请求的url
arg1:是要发送给服务器的数据 ,他是<key,value>形式的
arg2:发送请求的一连串操作 如下:
JsonHttpResponseHandler是AsyncHttpResponseHandler的子类
1 JsonHttpResponseHandler handler = new JsonHttpResponseHandler() {
2 @Override
3 public void onFailure(Throwable arg0, String arg1) {
4
5 super.onFailure(arg0, arg1);
6
7 }
8
9 @Override
10 public void onFinish() {
11
12 super.onFinish();
13
14 }
15
16 @Override
17 public void onSuccess(JSONObject arg1) {
18 super.onSuccess(arg1);
19
20 }
21
22 @Override
23 public void onStart() {
24
25 super.onStart();
26
27 }
28 };
1)onStart()
方法是开始发送请求的时候执行的,一般是把progressDialog放在这里面显示,提示用户等待
2)onFailure()
如果请求失败了,就会执行该方法,其余方法就都不执行了,用于提示用户网络出现故障
3)onSuccess()
是请求成功后,服务器就会返回JSONObject, arg1就是返回的JSONObject,
在里面解析JSONObject来回去数据,并显示在UI上
4)onFinish()
当发送请求成功后,就执行onFinish()
如上就是一些基本的用法。
这里贴一个结合AsyncHttpClient + 单例模式 + 观察者模式的例子
接口:
public interface TaskListener {public abstract void start();
public abstract String contentype(); // text, file
public abstract String filepath();
public abstract String requestUrl();
public abstract JSONObject requestData();
public abstract void messageUpdated(JSONObject msg);
public abstract void failure(String str);
public abstract void finish();
public abstract boolean needCacheTask();public abstract String readCache();
public abstract void updateCacheDate(List<HashMap<String, Object>> cacheData);}
实现:
19
20 public class CommandBase {
21
22 private static CommandBase m_instance = null;
23
24 private HashMap<AsyncHttpResponseHandler, TaskListener> m_task = new HashMap<AsyncHttpResponseHandler, TaskListener>();
25
26 private AsyncHttpClient m_httpClient = new AsyncHttpClient();
27
28 private UploadQueue m_uploadQueue = null;
29 private HashMap<AsyncHttpResponseHandler, UploadItem> m_tempRequest = new HashMap<AsyncHttpResponseHandler, UploadItem>();
30
31 private static String m_account = "";
32 private static String m_session = "";
33
34 private static String HostUrl = "http://222.18.162.187:8080/wasp/webservice/ap/";
35 private static JSONObject m_postData = new JSONObject();
36
37 Context m_context;
38 Context m_currContext;
39 Activity m_currActivity;
40
41 public void setCurrActivityContext(Context context, Activity activity) {
42 m_currContext = context;
43 m_currActivity = activity;
44 }
45
46 public void setMainActivityContext(Context context) {
47 m_context = context;
48
49 if (m_uploadQueue == null)
50 m_uploadQueue = new UploadQueue(m_context);
51 }
52
53 public static CommandBase instance() {
54 if (m_instance == null)
55 m_instance = new CommandBase();
56
57 return m_instance;
58 }
59
60 private CommandBase() {
61 m_httpClient.addHeader("Content-Type", "application/json");
62 m_httpClient.addHeader("Request-Client", "mobile/1.0.0");
63
64 /*
65 * JSONObject userData = new JSONObject(); try { userData.put("account",
66 * m_account); userData.put("session", m_session);
67 * m_postData.put("user", userData); } catch (JSONException e) {
68 * e.printStackTrace(); }
69 */
70 }
71
72 public void setUserInfo(String name, String session) {
73 m_account = name;
74 m_session = session;
75 System.out.println("setUser");
76 System.out.println("account=" + m_account);
77 JSONObject userData = new JSONObject();
78 try {
79 userData.put("account", m_account);
80 userData.put("session", m_session);
81 m_postData.put("user", userData);
82 } catch (JSONException e) {
83 e.printStackTrace();
84 }
85 }
86
87 CacheManager manager = new CacheManager();
88
89 public void readCache(final TaskListener taskListener) {
90 List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
91 String queryStr = taskListener.readCache();
92 list = manager.getCacheData(queryStr);
93 taskListener.updateCacheDate(list);
94 request(taskListener);
95 }
96
97 public void request(final TaskListener task) {
98 RequestParams postParam = new RequestParams();
99 postParam.put("req", requestData(task.requestData()));
100
101 JsonHttpResponseHandler handler = new JsonHttpResponseHandler() {
102 @Override
103 public void onFailure(Throwable arg0, String arg1) {
104 task.failure(arg1);
105 super.onFailure(arg0, arg1);
106 System.out.println("网络连接失败..");
107 if (task.needCacheTask() && m_uploadQueue != null
108 && m_tempRequest.containsKey(this))
109 m_uploadQueue.addItemToQueue(m_tempRequest.get(this));
110 m_tempRequest.remove(this);
111 Toast.makeText(m_currContext, "网络连接失败", Toast.LENGTH_SHORT)
112 .show();
113 }
114
115 @Override
116 public void onFinish() {
117 task.finish();
118 super.onFinish();
119 System.out.println("请求结束");
120 }
121
122 @Override
123 public void onSuccess(JSONObject arg1) {
124 super.onSuccess(arg1);
125 System.out.println("连接服务器成功!");
126 System.out.println("结果=" + arg1);
127 readData(arg1, this);
128 }
129
130 @Override
131 public void onStart() {
132 task.start();
133 super.onStart();
134 System.out.println("请求开始");
135 }
136 };
137
138 // TODO: save network request to local DB
139 if (task.needCacheTask()) {
140 System.out.println("++++++++++++++++++++++++++++++++++++++++");
141 m_tempRequest.put(
142 handler,
143 new UploadItem(0, requestUrl(task.requestUrl()),
144 requestData(task.requestData()),
145 task.contentype() == "text" ? 0 : 1, task
146 .filepath()));
147
148 }
149
150 m_task.put(handler, task);
151 m_httpClient.post(requestUrl(task.requestUrl()), postParam, handler);
152
153
154
155 }
156
157 private String requestUrl(String ap) {
158 return HostUrl + ap + ".action";
159 }
160
161 private String requestData(JSONObject data) {
162 JSONObject postData = new JSONObject();
163 postData = m_postData;
164 try {
165 postData.put("data", data);
166 } catch (JSONException e) {
167 e.printStackTrace();
168 }
169 System.out.println("postData=" + postData);
170 return postData.toString();
171 }
172
173 private void readData(JSONObject data, AsyncHttpResponseHandler handler) {
174 TaskListener task = m_task.get(handler);
175
176 if (task == null) {
177 m_task.remove(handler);
178 m_tempRequest.remove(handler);
179 return;
180 }
181 // TODO: Check the response data has Error or not
182 try {
183 JSONObject object = data.getJSONObject("error");
184 String code = object.getString("code");
185 String errorTag = object.getString("string");
186 System.out.println("code=" + code);
187 System.out.println("error=" + errorTag);
188 if (code.equals("0")) {
189 object = data.getJSONObject("data");
190 task.messageUpdated(data);
191 manager.updateCacheData(data);
192 m_tempRequest.remove(handler);
193 } else if (code.equals("-99")) {
194 Toast.makeText(m_currContext, "用户信息已过期,请重新登陆",
195 Toast.LENGTH_SHORT).show();
196 m_currActivity.finish();
197 } else {
198 System.out.println("#####################");
199 if (task.needCacheTask() && m_uploadQueue != null
200 && m_tempRequest.containsKey(handler)) {
201 System.out.println("_____________________________");
202 m_uploadQueue.addItemToQueue(m_tempRequest.get(handler));
203 }
204 m_tempRequest.remove(handler);
205 Toast.makeText(m_currContext, errorTag, Toast.LENGTH_SHORT)
206 .show();
207 }
208 } catch (JSONException e) {
209 e.printStackTrace();
210 if (task.needCacheTask() && m_uploadQueue != null
211 && m_tempRequest.containsKey(handler)) {
212 m_uploadQueue.addItemToQueue(m_tempRequest.get(handler));
213 }
214 m_tempRequest.remove(handler);
215
216 }
217
218
219 m_task.remove(handler);
220 }
221
222 }
android AsyncHttpClient 开源框架的使用