2012-11-04 2 views
4

Je suis en train de retourner la liste des tweets après l'analyse de la tâche asynchrone .... Mais je ne récupère pas l'arrayliste de la tâche. Quelqu'un peut-il suggérer une solution?Comment retourner l'objet en utilisant une tâche asynchrone?

public class Main extends ListActivity { 
    String MY_APP_TAG = "com.list"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ArrayList listItems = new ArrayList(); 
     new myAsyncTask().execute(listItems); 

     setListAdapter(new ArrayAdapter(this, R.layout.tweet, R.id.tweet,listItems)); 
     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // When clicked, show a Toaster 
       Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    private class myAsyncTask extends AsyncTask<ArrayList<Object>, Void, Void> 
    { 
     ArrayList<Object> listItems; 
     ProgressDialog dialog; 
     @Override 
     protected void onPreExecute() { 
      dialog = ProgressDialog.show(Main.this, "", "Loading...."); 
     } 
     @Override 
     protected Void doInBackground(ArrayList<Object>... params) { 

      String host = "api.twitter.com"; 
      String twitterURL = "http://"+host+"/1/statuses/user_timeline.json?screen_name=i1990jain&amp;count;=10"; 
      try { 
       HttpClient client = new DefaultHttpClient(); 
       BasicHttpContext localContext = new BasicHttpContext(); 
       HttpHost targetHost = new HttpHost(host, 80, "http"); 
       HttpGet httpget = new HttpGet(twitterURL); 
       httpget.setHeader("Content-Type", "application/json"); 
       HttpResponse response = client.execute(targetHost, httpget, localContext); 
       HttpEntity entity = response.getEntity(); 
       Object content = EntityUtils.toString(entity); 
       Log.d(MY_APP_TAG, "OK: " + content.toString()); 

       JSONArray ja = new JSONArray(content.toString()); 

       for(int i = 0; i < ja.length(); i++){ 
        JSONObject jo = ja.getJSONObject(i); 
        listItems.add(jo.getString("text")); 
       } 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      dialog.dismiss(); 
     } 
    } 
} 
+0

Soit deux threads en cours d'exécution en mode asynchrone et en utilisant AsyncTask.onPostExecute() gérer résultat, ou en utilisant explicitement thread d'interface utilisateur bloc AsyncTask.get() et attendre résultat de retour de thread de travail. Notez que ces derniers sacrifient réellement le bénéfice de AsyncTask et peuvent provoquer une exception ANR. – yorkw

Répondre

1

comment je l'ai eu à travailler

public class Main extends ListActivity { 

    String MY_APP_TAG = "com.vidyut"; 
    ArrayList<Object> list = new ArrayList<Object>(); 
     /** Called when the activity is first created. */ 
    @SuppressWarnings("unchecked") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myAsyncTask task = new myAsyncTask(); 
     task.execute(); 

} 

    private class myAsyncTask extends AsyncTask<ArrayList<Object>, ArrayList<Object>, ArrayList<Object>> 
    { 
     ProgressDialog dialog; 
     @Override 
     protected void onPreExecute() { 
      dialog = ProgressDialog.show(Main.this, "", "Loading...."); 
     } 

     @Override 
     protected ArrayList<Object> doInBackground(ArrayList<Object>... params) { 

      String host = "api.twitter.com"; 
      String twitterURL = "http://"+host+"/1/statuses/user_timeline.json?screen_name=i1990jain&amp;count;=10"; 
     try { 
      HttpClient client = new DefaultHttpClient(); 
      BasicHttpContext localContext = new BasicHttpContext(); 
      HttpHost targetHost = new HttpHost(host, 80, "http"); 
      HttpGet httpget = new HttpGet(twitterURL); 
      httpget.setHeader("Content-Type", "application/json"); 
      HttpResponse response = client.execute(targetHost, httpget, localContext); 
      HttpEntity entity = response.getEntity(); 
      Object content = EntityUtils.toString(entity); 
      Log.d(MY_APP_TAG, "OK: " + content.toString()); 

      JSONArray ja = new JSONArray(content.toString()); 

      for(int i = 0; i < ja.length(); i++){ 
      JSONObject jo = ja.getJSONObject(i); 
      list.add(jo.getString("text")); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
      return list; 
     } 
     protected void onPostExecute(ArrayList<Object> list) { 
      dialog.dismiss(); 

      Log.d(MY_APP_TAG, "The returned list contains " +list.size()+ "elements"); 
      setListAdapter(new ArrayAdapter<Object>(Main.this, R.layout.tweet, R.id.tweet,list)); 
       ListView lv = getListView(); 
       lv.setTextFilterEnabled(true); 
       lv.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        // When clicked, show a Toaster 
         Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
      }); 

     } 

    } 
} 
3

C'est AsyncTask<Params, Progress, Result>. Donc, vous devriez le déclarer comme AsyncTask<Void, Void, ArrayList<Object>>.

Renvoie la liste à partir de la méthode doInBackground.

+0

retourner la liste n'est pas possible de doInBackground – Rishabh

+2

Ce n'est pas? Mais c'est exactement ce que vous faites dans la réponse que vous avez postée ... Exactement ce que j'ai dit. – Jong

1

Pour mettre à jour votre activité avec de nouvelles données provenant d'un thread asynchrone, vous pouvez utiliser la méthode onProgressUpdate()/onPostExecute() ou Si vous utilisez un Thead, vous devez utiliser un Heandler.

//aciticty class: 
final Handler mHandler = new Handler(); 

//inside an async thread 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     //update GUI thread here 
    } 
}); 
+0

J'utilise Async Tâche – Rishabh

+0

Je ne pourrai pas mettre à jour la vue en utilisant le fil – Rishabh

1

Où voulez-vous retourner vos résultats? Vous pouvez accéder à listItems:

protected void onPostExecute(Void result) { 

et c'est là, vous devez utiliser listItems par exemple à remplir votre liste. Cette méthode est en cours d'exécution sur le thread de l'interface utilisateur afin de pouvoir le faire en toute sécurité.

Dans votre doInBackground, je ne vois pas les éléments listItems à initialiser à une valeur, donc il est probablement nul. Vous devriez en fait créer une instance séparée de listItems à utiliser dans doInBackground, puis l'affecter à listView dans onPostExecute.

Questions connexes