我很久以前遇到了同樣的問題。從那時起,我實現了自己的類來從服務器發佈/獲取JSON數據。當我打電話時,我使用一個接口來回調活動或片段,這樣我只需要自定義回調,而不是整個Asynctask。類似:
/**
* An interface for calling back from service
*
* @author
*
*/
public interface JSONCallback {
public void onError(String error);
/**
* A JSONObject or a JSONArray
* @param object
*/
public void onSuccess(Object object);
}
public static class PostTask extends AsyncTask<String, String, Integer>{
Activity activity;
String message;
ProgressDialog pDialog;
Object object = null;
HttpEntity entity;
JSONCallback callback;
boolean getJSONArray;
private String error = null;
private HashMap<String, String> headers;
public HashMap<String, String> getHeaders() {
return headers;
}
public void setHeaders(HashMap<String, String> headers) {
this.headers = headers;
}
public PostTask(Activity activity, String message, HttpEntity entity, JSONCallback callback){
this.activity = activity;
this.message = message;
this.entity = entity;
this.callback = callback;
this.getJSONArray = false;
}
public PostTask(Activity activity, String message, HttpEntity entity, JSONCallback callback, boolean getJSONArray){
this.activity = activity;
this.message = message;
this.entity = entity;
this.callback = callback;
this.getJSONArray = getJSONArray;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(message != null){
pDialog = ProgressDialog.show(activity, null, message, true, true, new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
cancel(true); //cancel this task
}
});
}
}
@Override
protected Integer doInBackground(String... params) {
try {
object = getJSONPOST(activity, params[0], entity, getJSONArray, headers);
return 0;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
try {
pDialog.dismiss();
} catch (Exception e) {
}
if(callback!=null && !activity.isFinishing()){
if(result == 0){
callback.onSuccess(object);
}else{
callback.onError(error);
}
}
}
}
public static Object getJSONPOST(Context context, String url, HttpEntity entity, boolean isJSONArray, HashMap<String, String> headers) throws ClientProtocolException, IOException, JSONException{
DefaultHttpClient client = new DefaultHttpClient();
try{
client.getCookieStore().clear();
}catch(Exception e){
e.printStackTrace();
}
HttpPost post = new HttpPost(url);
post.setEntity(entity);
// post.setHeader("content-type", "application/json");
// post.setHeader("charset", "UTF-8");
if(headers != null){
Set<String> keys = headers.keySet();
for(String key:keys){
// Log.d("", "Header name: "+key+", header value: "+headers.get(key));
post.setHeader(key, headers.get(key));
}
}
HttpResponse response = client.execute(post);
// Log.d( 「」, 「響應錯誤代碼:」 + response.getStatusLine()getStatusCode()); InputStream is = response.getEntity()。getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader( is,「UTF-8」),8); StringBuilder sb = new StringBuilder(); String line = null; ((line = reader.readLine())!= null){ sb.append(line +「\ n」); } is.close(); if(!isJSONArray) return new JSONObject(sb.toString()); else return new JSONArray(sb.toString()); }
注意,這個模型只是爲了解釋,應該用來創建你自己的,所以你可以適合你的需求。我已經完成了GET,PUT和DELETE方法。
邊問:你可以從HttpClient的獲得CookieManager(如果你使用cookies來保存會話),並將其存儲在一個全球性的成員,或者堅持他們即使在應用程序關閉。這一切都取決於你在做什麼。
希望它有幫助。
退房Volley ..還有很多其他人喜歡它。不要重新發明車輪,特別是如果你以前從未建造過汽車。 – 323go 2014-09-24 03:53:06
很高興知道Volley的官方解決方案。它應該是與AsyncTask一起固有的組件... PS,詛咒那些downvoters,哈... – mrmoment 2014-09-25 05:36:04
Android的查詢是一個選項,似乎更容易使用Web和純Java的人,像我:) – mrmoment 2014-12-14 07:09:55