I'm trying to display a custom progressdialog while loading RSS feed from an HTTP server, I made a hard search, but nothing helped me to do this, the only thing I know is that the solution should use AsyncTask
, but I'm confusing about the params to pass to this AsyncTask
. Here's my activity :
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); } } }
Can you please help me add AsyncTask
to this?
An asynchronous task is defined by 3 generic types, called Params , Progress and Result , and 4 steps, called onPreExecute , doInBackground , onProgressUpdate and onPostExecute .
doInBackground() : This method contains the code which needs to be executed in background.
AsyncTask instances can only be used one time.
/** * 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; } }
Fixed by moving the view modifiers to onPostExecute so the fixed code is :
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 your code was very helpful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With