我很久以前遇到了同样的问题。从那时起,我实现了自己的类来从服务器发布/获取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