2012-08-22 44 views
7

Tôi vừa mới đọc và kiểm tra AsyncTask gần đây và bây giờ tôi cần biết làm cách nào tôi có thể chuyển nhiều giá trị trong phần onPostExecute. Tôi sử dụng trình phân tích cú pháp JSON để lấy giá trị từ web nhưng giá trị tôi nhận được từ JSON là nhiều giá trị mà tôi chuyển các giá trị đó vào một mảng được phân tách bằng tiêu đề cột của từng dữ liệu được tìm nạp và đây là phần mà tôi phải trả về để sử dụng onPostExecute. Nhưng theo như tôi biết bạn chỉ có thể sử dụng sự trở lại một lần cho mỗi lần chạy (sửa tôi nếu tôi sai xin vui lòng).Android AsyncTask trả về nhiều giá trị trong doInBackground để sử dụng cho onPostExecute

Vâng đây là mã của tôi cho đến nay:

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(); 
     } 

    } 

Vâng thêm, mã này hoạt động tốt khi tôi trở về chỉ có một chuỗi Array (danh sách) nhưng tôi bị lẫn lộn bây giờ trong phần thứ hai. Ngoài ra các thành phố được khai báo trong lớp Main và ShowCities() chỉ được sử dụng để hiển thị. Vì vậy, tôi không bận tâm thêm các mã.

+0

sử dụng onPregressCập nhật và triển khai bài đăng của bạnExecute logic có – rajpara

Trả lời

5

bạn có thể làm một điều Làm cho ArrayList của bạn tĩnh và truy cập nó khi bạn muốn.

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(); 
     } 

    } 

bây giờ bạn có thể sử dụng cả hai LIST & LIST1 khi bạn muốn. bạn cũng có thể không cần phải trả về arraylist trong DoInBackground.

Hy vọng nó sẽ giúp bạn.

+0

Tôi cần thực hiện ngay bây giờ, tôi sẽ quay lại câu trả lời của bạn sau. cảm ơn. – KaHeL

+0

Làm việc tốt như tôi muốn. Mặc dù tôi nghĩ rằng câu hỏi của tôi đã tạo thành hai câu hỏi nhưng giờ đây câu hỏi này hoàn toàn khả thi với tôi. Cảm ơn người đàn ông. – KaHeL

+1

Có nhiều vấn đề với giải pháp này. Đầu tiên, danh sách sẽ tiếp tục phát triển sau mỗi lần thực hiện. Họ tiếp tục thêm kết quả mới và không bao giờ xóa chúng. Thứ hai, đây không phải là chủ đề an toàn. nếu bạn có hai AsyncTasks làm việc cùng một lúc bạn sẽ có máy chủ của các vấn đề, như điều kiện chủng tộc, ngoại lệ sửa đổi đồng thời, vv – Sameer

3

Tạo một lớp mới với hai Danh sách. Sử dụng lớp đó làm kiểu trả về.

+3

Đã có lớp tiện ích [Pair] (http://developer.android.com/reference/android/util/Pair.html) trong SDK ... – Jens

+0

googling trên cặp đó. Cảm ơn! – KaHeL

Các vấn đề liên quan