2012-08-22 64 views
7

我剛剛閱讀並測試了AsyncTask,現在我需要知道如何在onPostExecute部分傳遞多個值。那麼我使用JSON解析器從Web獲取值,但是我從JSON獲得的值是多個值,我將這些值傳遞到數組中,並將每個數據的列標題分隔開,這是我應該返回的部分爲onPostExecute使用。但據我所知,每次運行只能使用一次返回(如果我錯了,請糾正我)。Android AsyncTask在doInBackground中返回多個值用於onPostExecute

那麼這裏是到目前爲止我的代碼:

public class GetInfo extends AsyncTask<String, Void, List<String>>{ 

     private final String TAG = null; 
     InputStream is = null; 
     StringBuilder sb=null; 
     List<String> list = new ArrayList<String>(); 

     @Override 
     protected List<String> doInBackground(String... url) { 
      String result = ""; 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

       //CONNECT TO DATABASE 
       try{ 
         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost(url[0]); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         is = entity.getContent(); 
         Log.v(TAG, "connected"); 
       }catch(Exception e){ 
         Log.v(TAG, "run failed"); 

         Log.e("log_tag", "Error in http connection "+e.toString()); 
       } 

       //BUFFERED READER FOR INPUT STREAM 
       try{ 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
        sb = new StringBuilder(); 
        String line = "0"; 

        while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
        } 
        is.close(); 
        result=sb.toString(); 
        Log.v(TAG, "buffered read"); 
       }catch(Exception e){ 
        Log.v(TAG, "buffered error"); 
         Log.e("log_tag", "Error converting result "+e.toString()); 
       } 

       //CONVERT JSON TO STRING 
       try{ 
        Log.v(TAG, result); 

         JSONArray jArray = new JSONArray(result); 
         JSONObject json_data=null; 

         for(int i=0;i<jArray.length();i++){ 
          Log.v(TAG, "loop start"); 

           json_data = jArray.getJSONObject(i); 
           list.add(json_data.getString("id")); 
           list2.add(json_data.getString("city")); 
           Log.v(TAG, "list added"); 
         } 

       }catch(JSONException e){ 
        Log.v(TAG, "rest failed"); 
         Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

       Log.v(TAG, list.toString()); 

       return list; //I also need to return the list2 here 

     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      cities = result; //lost in this part hahaha! 
      showCities(); 
     } 

    } 

好加,這個代碼工作正常時,我只返回一個字符串數組(列表),但我現在感到困惑的第二部分。 Main類和ShowCities()中也聲明瞭城市,僅用於顯示。所以我不打擾添加代碼。

+0

使用onPregressUpdate,並在那裏實現你的postExecute邏輯 – rajpara

回答

5

你可以做一件事讓你的ArrayList爲靜態,並在需要時訪問它。

public static List<String> LIST = new ArrayList<String>(); 
public static List<String> LIST1 = new ArrayList<String>(); 

public class GetInfo extends AsyncTask<String, Void, List<String>>{ 

     private final String TAG = null; 
     InputStream is = null; 
     StringBuilder sb=null; 


     @Override 
     protected List<String> doInBackground(String... url) { 
      String result = ""; 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

       //CONNECT TO DATABASE 
       try{ 
         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost(url[0]); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         is = entity.getContent(); 
         Log.v(TAG, "connected"); 
       }catch(Exception e){ 
         Log.v(TAG, "run failed"); 

         Log.e("log_tag", "Error in http connection "+e.toString()); 
       } 

       //BUFFERED READER FOR INPUT STREAM 
       try{ 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
        sb = new StringBuilder(); 
        String line = "0"; 

        while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
        } 
        is.close(); 
        result=sb.toString(); 
        Log.v(TAG, "buffered read"); 
       }catch(Exception e){ 
        Log.v(TAG, "buffered error"); 
         Log.e("log_tag", "Error converting result "+e.toString()); 
       } 

       //CONVERT JSON TO STRING 
       try{ 
        Log.v(TAG, result); 

         JSONArray jArray = new JSONArray(result); 
         JSONObject json_data=null; 

         for(int i=0;i<jArray.length();i++){ 
          Log.v(TAG, "loop start"); 

           json_data = jArray.getJSONObject(i); 
           LIST.add(json_data.getString("id")); 
           LIST1.add(json_data.getString("city")); 
           Log.v(TAG, "list added"); 
         } 

       }catch(JSONException e){ 
        Log.v(TAG, "rest failed"); 
         Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

       Log.v(TAG, list.toString()); 

       return LIST; //I also need to return the list2 here 

     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      cities = result; //lost in this part hahaha! 
      showCities(); 
     } 

    } 

現在,當你想它,你可以用你的兩個LIST & LIST1。您也可能不需要在DoInBackground中返回ArrayList。

希望它能幫助你。

+0

我現在需要去,我會稍後再回答你的答案。謝謝。 – KaHeL

+0

工作得很好,因爲我想。雖然我認爲我的問題在一個問題中產生了兩個問題,但現在對我來說這個問題是可行的。謝啦。 – KaHeL

+1

該解決方案存在多個問題。首先,每次執行後列表都會繼續增長。他們不斷添加新的結果並且不會刪除它們。其次,這不是線程安全的。如果你有兩個AsyncTasks在同一時間工作,你將有很多問題,如競賽條件,併發修改異常等 – Sameer

3

用兩個列表創建一個新類。使用該類作爲返回類型。

+3

已經有實用工具類[配對](http:///developer.android.com/reference/android/util/Pair.html)在SDK中... – Jens

+0

谷歌搜索該對。謝謝! – KaHeL

相關問題