2014-09-24 39 views
-2

我開始建立一個應用程序,一些活動會從服務器獲取&後的數據。例如,登錄活動將發佈用戶名和密碼以嘗試登錄,列表活動將從服務器數據庫加載項目。現在,對於服務器和應用程序之間的每個通信,我使用一個AsyncTask來執行此操作。爲了重用,我有一個基類MyAsyncTask類,每個真正的任務擴展它。如何設計AsyncTasks聯網Android應用

public class MyAsyncTask extends AsyncTask<String, Integer, String>{ 

    protected String path; 

    public MyAsyncTask(Activity activity, String path){ 
     this.path=path;//each task will connect to its own url path 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String ret=null; 
     try { 
      ret=postData(params); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return ret; 
    } 

    public String postData(String... params) throws IOException{ 
     String httpUrl=Constants.SERVER_URL+path; 
     HttpPost httpRequest=new HttpPost(httpUrl); 
     List<NameValuePair> httpparams=formHttpParams(params); 
     //create HttpClient and connect to server and post data 
     ... ... 
    } 

    public ArrayList<NameValuePair> formHttpParams(String params[]){ 
     return new ArrayList<NameValuePair>();//sub classes need to override the parameter assignment 
    } 
    //protected void onPostExecute(String result) {}//override this for response handling 
} 

我的問題是,可以使用單個AsyncTask做到這一點?否則,我會有很多子類延伸MyAsyncTask這是處理Android網絡應用程序的正確方法嗎? (目前,如果我想做一個類,我會有複雜的參數解析過程並管理多個相應的路徑。)

此外,如果我仍然使用多個子類來擴展此基類,是否會有單個我的應用程序和服務器之間的「會話」,所以我可以將用戶身份信息(如用戶名)保存在服務器的會話部分? (這是一個「面」的問題,因爲我可以用這門課程的實驗......)

+1

退房Volley ..還有很多其他人喜歡它。不要重新發明車輪,特別是如果你以前從未建造過汽車。 – 323go 2014-09-24 03:53:06

+0

很高興知道Volley的官方解決方案。它應該是與AsyncTask一起固有的組件... PS,詛咒那些downvoters,哈... – mrmoment 2014-09-25 05:36:04

+0

Android的查詢是一個選項,似乎更容易使用Web和純Java的人,像我:) – mrmoment 2014-12-14 07:09:55

回答

0

你可以嘗試使用Retrofit REST客戶端從廣場。 AsyncTask的主要問題是無法輕鬆處理方向更改,但如果要使用它,則可以在AsyncTask構造函數中傳遞Command

public interface Command { 
    public Object execute(); 
} 

public class MyTask extends AsyncTask<String, String, Object> { 

    private Exception e; 

    private Command command; 

    public MyTask(Command command) { 
     this.command = command; 
    } 

    public Object doInBackground() { 
     try { 
      return command.execute(); 
     } catch(Exception e) { 
      this.e = e; 
     } 

     return null; 
    } 

    public void onPostExecute(final Object result) { 
     //Handle your result 
    } 
} 

就是這樣的。

1

我很久以前遇到了同樣的問題。從那時起,我實現了自己的類來從服務器發佈/獲取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來保存會話),並將其存儲在一個全球性的成員,或者堅持他們即使在應用程序關閉。這一切都取決於你在做什麼。

希望它有幫助。