2012-08-22 16 views
7

için kullanılabilecek doInBackground'daki birden çok değeri döndürüyor Yakın zamanda AsyncTask'ı okudum ve test ettim ve şimdi onPostExecute bölümünde birden çok değeri nasıl geçirebileceğimi bilmem gerekiyor. Web'den değerler almak için bir JSON ayrıştırıcısı kullanıyorum, ancak JSON'tan aldığım değerler, bu değerleri getirilen her bir verinin sütun başlıklarıyla ayrılmış bir diziye geçirdiğim birden çok değerdir ve bu, geri döndürmem gereken kısmıdır. onPostExecute kullanımı için. Ama bildiğim kadarıyla sadece bir kez koşuyu bir kere kullanabiliyorsunuz (eğer yanılıyorsam düzeltin lütfen).Android AsyncTask, onPostExecute

Eh burada şimdiye kadar benim kod:

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

    } 

Eh eklemek için, sadece bir dize Array (liste) return ama ikinci bölümde artık karışık zaman bu kod çalışıyor. Ayrıca, şehirler Ana sınıfta ve yalnızca gösterim için kullanılan ShowCities() olarak bildirilir. Bu yüzden kodları eklemekten rahatsız değilim.

+0

onPregressUpdate kullanın ve postExecute mantığınızı buradan uygulayın – rajpara

cevap

5

Yapabilecekleriniz Tek şey ArrayList'inizi Statik yapın ve istediğiniz zaman erişin. sen istediğinde

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

    } 

şimdi size LİSTESİ hem & LIST1 kullanabilirsiniz. ayrıca DoInBackground'da arraylist'e dönmeniz gerekmeyebilir.

Size yardımcı olacağını umuyorum.

+0

Şimdi gitmem gerekiyor, cevabınızı daha sonra geri alacağım. Teşekkürler. – KaHeL

+0

İstediğim kadar iyi çalışır. Her ne kadar benim sorum tek bir soruyla sonuçlandığını düşünmeme rağmen, bu benim için şimdi işe yarayabilir. Teşekkürler dostum. – KaHeL

+1

Bu çözümle ilgili birçok sorun var. İlk olarak, listeler her yürütmeden sonra büyümeye devam edecektir. Yeni sonuçlar eklemeye devam ediyorlar ve asla kaldırmazlar. İkincisi, bu iplik güvenli değildir. Aynı anda iki AsyncTask'ınız varsa, yarış koşulları, eşzamanlı modifikasyon istisnası vb. gibi bir dizi konağa sahip olursunuz. – Sameer

3

İki Listeleri ile yeni bir sınıf oluşturun. Bu sınıfı dönüş türü olarak kullanın.

+3

Şimdilik yardımcı program sınıfı var [Pair] (http:/SDK'da /developer.android.com/reference/android/util/Pair.html), bu Çift üzerinde googling yapmak için ... – Jens

+0

. Teşekkürler! – KaHeL