2010-12-27 12 views
60

Ich versuche, einen benutzerdefinierten progressdialog beim Laden von RSS-Feed von HTTP-Server anzuzeigen, machte ich eine harte Suche, aber nichts half mir dabei, das einzige, was ich weiß ist, dass die Lösung AsyncTask verwenden sollte, aber ich verwirre über die Parameter, um diese AsyncTask zu übergeben. Hier ist meine Tätigkeit:ProgressDialog in 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); 
     } 
    } 

} 

Können Sie mir bitte helfen AsyncTask diesem hinzufügen?

Danke, Houssem

Antwort

41

behoben, indem sie die Ansicht Modifikatoren OnPostExecute bewegen, um die festgelegten Code ist:

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 Code war sehr hilfreich.

+3

ok, upvote oder als die Lösung markieren =) –

+0

Kann Handler nicht darin erstellen Thread, der Looper.prepare() nicht aufgerufen hat, bekomme ich diesen Fehler. wie man das löst. – Noby

+0

Ich denke, dass Sie noch eine Sache hinzufügen müssen. Sie müssen ein globales privates Objekt für Ihre AsyncTask erstellen und wenn die Aktivität zerstört wird, müssen Sie die AsyncTask abbrechen. Wenn Sie in Ihrem Fall die Zurück-Taste drücken, bevor die AsyncTask abgeschlossen ist, stürzt die App höchstwahrscheinlich ab. – 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

Danke Jungs, also versuche ich das, und als ich fragte, welche Params shou ich hier passieren? Geschütztes boolesches doInBackground (final String ... args), weil die Zeile MessageListAdapter adapter = new MessageListAdapter (this, titles) den Fehler – Houssem

+0

activity auslöst. Sie müssen nur Listenadapter einstellen. –

+0

Entschuldigung Vlad, ich bin total verwirrt: S (Anfänger Fall) – Houssem

3

Vor ein paar Tagen fand ich eine sehr gute Lösung für dieses Problem. Lesen Sie darüber here. In zwei Worten hat Mike einen AsyncTaskManager erstellt, der ProgressDialog und AsyncTask vermittelt. Es ist sehr einfach, diese Lösung zu verwenden. Sie müssen nur mehrere Schnittstellen und mehrere Klassen in Ihr Projekt einfügen und in Ihrer Aktivität einen einfachen Code schreiben und Ihre neue AsyncTask aus BaseTask verschachteln. Ich rate Ihnen auch, Kommentare zu lesen, da es einige nützliche Tipps gibt.

8

AsyncTask ist sehr hilfreich!

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

Es ist schon ein paar Jahre her, seit dieser Frage (und da hat jemand eine Antwort geschrieben) gefragt wurde. Seitdem wurde ProgressDialog in der API-Ebene O gemäß Android's official documentation. als veraltet eingestuft. Daher könnten Sie anstelle eines ProgressDialogs die Verwendung von an inline progress bar erwägen, wie die Autoren der Dokumentation vorschlagen.

-1

Diese Frage ist bereits beantwortet und die meisten Antworten hier sind korrekt, aber sie lösen kein großes Problem mit Konfigurationsänderungen. Werfen Sie einen Blick auf diesen Artikel https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/, wenn Sie eine asynchrone Aufgabe besser schreiben möchten.

+0

@Who je down gewählt dies. Könnten Sie mir bitte sagen, was mit dieser Antwort nicht stimmt? Das ist einer der guten Artikel, den ich gelesen habe und den ich mit den Entwicklern auf der anderen Seite teilen möchte. – Prakash

Verwandte Themen