2010-12-27 21 views
60

Estoy tratando de mostrar un progreso de diálogo personalizado mientras cargaba rss feed desde el servidor http, hice una búsqueda difícil, pero nada me ayudó a hacer esto, lo único que sé es que la solución debe usar AsyncTask, pero estoy confundido acerca de los parámetros para pasar a este AsyncTask. Aquí está mi actividad:progressDialog en AsyncTask

import java.util.ArrayList; 
import java.util.List; 

import com.cyberesa.info.BaseFeedParser; 
import com.cyberesa.info.Message; 
import com.cyberesa.info.MessageListAdapter; 
import com.cyberesa.info.R; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 
    private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     loadFeed(); 

    } 

    private void loadFeed(){ 
     try{ 
      BaseFeedParser parser = new BaseFeedParser(); 
      messages = parser.parse(); 
      List<Message> titles = new ArrayList<Message>(messages.size()); 
      for (Message msg : messages){ 
       titles.add(msg); 
      } 
      MessageListAdapter adapter = new MessageListAdapter(this,titles); 
      this.setListAdapter(adapter); 
      adapter.notifyDataSetChanged(); 

     } catch (Throwable t){ 
      Log.e("ImageLoader",t.getMessage(),t); 
     } 
    } 

} 

puede usted por favor me ayude a añadir AsyncTask a esto?

Gracias, Houssem

Respuesta

41

fijo moviendo la vista modificadores para onPostExecute lo que el código fijo es:

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 

    //private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     new ProgressTask(Soirees.this).execute(); 


    } 


    private class ProgressTask extends AsyncTask<String, Void, Boolean> { 
     private ProgressDialog dialog; 
     List<Message> titles; 
     private ListActivity activity; 
     //private List<Message> messages; 
     public ProgressTask(ListActivity activity) { 
      this.activity = activity; 
      context = activity; 
      dialog = new ProgressDialog(context); 
     } 



     /** progress dialog to show user that the backup is processing. */ 

     /** application context. */ 
     private Context context; 

     protected void onPreExecute() { 
      this.dialog.setMessage("Progress start"); 
      this.dialog.show(); 
     } 

      @Override 
     protected void onPostExecute(final Boolean success) { 
       List<Message> titles = new ArrayList<Message>(messages.size()); 
       for (Message msg : messages){ 
        titles.add(msg); 
       } 
       MessageListAdapter adapter = new MessageListAdapter(activity, titles); 
       activity.setListAdapter(adapter); 
       adapter.notifyDataSetChanged(); 

       if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 

      if (success) { 
       Toast.makeText(context, "OK", Toast.LENGTH_LONG).show(); 
      } else { 
       Toast.makeText(context, "Error", Toast.LENGTH_LONG).show(); 
      } 
     } 

     protected Boolean doInBackground(final String... args) { 
      try{  
       BaseFeedParser parser = new BaseFeedParser(); 
       messages = parser.parse(); 


       return true; 
      } catch (Exception e){ 
       Log.e("tag", "error", e); 
       return false; 
      } 
      } 


    } 

} 

@Vladimir, THX su código era muy útil.

+3

ok, upvote o mark como solución =) –

+0

No se puede crear controlador dentro el hilo que no ha llamado a Looper.prepare() recibo este error. cómo resolver esto – Noby

+0

Creo que debe agregar una cosa más a esto. Necesita crear un objeto privado global para su AsyncTask y cuando se destruye la actividad necesita cancelar la tarea AsyncTask. En su caso, si el usuario presiona el botón Atrás antes de que se complete la AsyncTask, la aplicación se bloqueará probablemente. – tasomaniac

123
/** 
* this class performs all the work, shows dialog before the work and dismiss it after 
*/ 
public class ProgressTask extends AsyncTask<String, Void, Boolean> { 

    public ProgressTask(ListActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    /** progress dialog to show user that the backup is processing. */ 
    private ProgressDialog dialog; 
    /** application context. */ 
    private ListActivity activity; 

    protected void onPreExecute() { 
     this.dialog.setMessage("Progress start"); 
     this.dialog.show(); 
    } 

     @Override 
    protected void onPostExecute(final Boolean success) { 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 


     MessageListAdapter adapter = new MessageListAdapter(activity, titles); 
     setListAdapter(adapter); 
     adapter.notifyDataSetChanged(); 


     if (success) { 
      Toast.makeText(context, "OK", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(context, "Error", Toast.LENGTH_LONG).show(); 
     } 
    } 

    protected Boolean doInBackground(final String... args) { 
     try{  
      BaseFeedParser parser = new BaseFeedParser(); 
      messages = parser.parse(); 
      List<Message> titles = new ArrayList<Message>(messages.size()); 
      for (Message msg : messages){ 
       titles.add(msg); 
      } 
      activity.setMessages(titles); 
      return true; 
     } catch (Exception e) 
      Log.e("tag", "error", e); 
      return false; 
     } 
    } 
} 

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 
    private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     // just call here the task 
     AsyncTask task = new ProgressTask(this).execute(); 
    } 

    public void setMessages(List<Message> msgs) { 
     messages = msgs; 
    } 

} 
+0

Gracias chicos, estoy intentando esto, y como pregunté, ¿qué params debo pasar aquí? protected Boolean doInBackground (final String ... args) porque la línea MessageListAdapter adapter = new MessageListAdapter (this, titles) arroja el error – Houssem

+0

actividad será suficiente. solo necesitas configurar el adaptador de lista. –

+0

lo siento Vlad, estoy totalmente confundido: S (caso de principiante) – Houssem

3

Hace un par de días encontré una muy buena solución a este problema. Lea sobre esto here. En dos palabras, Mike creó un AsyncTaskManager que media ProgressDialog y AsyncTask. Es muy fácil de usar esta solución. Solo necesita incluir en su proyecto varias interfaces y varias clases y en su actividad escriba un código simple y anide su nueva AsyncTask de BaseTask. También te aconsejo que leas los comentarios porque hay algunos consejos útiles.

8

¡AsyncTask es muy útil!

class QueryBibleDetail extends AsyncTask<Integer, Integer, String>{ 
     private Activity activity; 
     private ProgressDialog dialog; 
     private Context context; 

     public QueryBibleDetail(Activity activity){ 
      this.activity = activity; 
      this.context = activity; 
      this.dialog = new ProgressDialog(activity); 
      this.dialog.setTitle("查询经文"); 
      this.dialog.setMessage("正在查询:"+tome+chapterID+":"+sectionFromID+"-"+sectionToID); 
      if(!this.dialog.isShowing()){ 
       this.dialog.show(); 
      } 
     } 

     @Override 
     protected String doInBackground(Integer... params) { 
      Log.d(TAG,"经文doInBackground"); 
      publishProgress(params[0]); 

      if(sectionFromID > sectionToID){ 
       return ""; 
      } 

      String queryBible = "action=query_bible&article="+chapterID+"&id="+tomeID+"&verse_start="+sectionFromID+"&verse_stop="+sectionToID+""; 
      try{ 
       String bible = (Json.getRequest(HOST+queryBible)).trim(); 
       bible = android.text.Html.fromHtml(bible).toString(); 
       return bible; 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String bible){ 
      Log.d(TAG,"经文onPostExecute"); 
      TextView bibleBox = (TextView) findViewById(R.id.bibleBox); 
      bibleBox.setText(bible); 
      this.dialog.dismiss(); 
     } 
    } 
0

Han pasado unos años desde que se hizo esta pregunta (y desde que alguien ha publicado una respuesta). Desde entonces, ProgressDialog quedó en desuso en el nivel O de API, de acuerdo con Android's official documentation. Como tal, puede considerar el uso de an inline progress bar en lugar de un ProgressDialog como sugieren los autores de la documentación.

-1

Esta pregunta ya está respondida y la mayoría de las respuestas aquí son correctas, pero no resuelven un problema importante con los cambios de configuración. Eche un vistazo a este artículo https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/ si desea escribir una tarea asíncrona de una mejor manera.

+0

@Quién abajo votó esto. ¿Podría decirme qué le pasa a esta respuesta? Ese es uno de los buenos artículos que leí y me gustaría compartir con desarrolladores intermedios. – Prakash

Cuestiones relacionadas