J'essaie d'afficher un journal de progrès personnalisé lors du chargement du flux RSS à partir du serveur http. J'ai fait une recherche difficile, mais rien ne m'a aidé à le faire. La seule chose que je sache, c'est que la solution doit utiliser AsyncTask. les paramètres à passer à cette AsyncTask . Voici mon activité:
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);
}
}
}
Pouvez-vous s'il vous plaît m'aider à ajouter AsyncTask à cela?
Merci, Houssem
Fixé en déplaçant les modificateurs de vue vers onPostExecute afin que le code fixe soit:
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, merci votre code était très utile.
/**
* 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;
}
}
AsyncTask est très utile!
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();
}
}
Il y a quelques jours, j'ai trouvé une très bonne solution à ce problème. Lire à ce sujet ici . En deux mots, Mike a créé un AsyncTaskManager qui associe ProgressDialog et AsyncTask. C'est très facile d'utiliser cette solution. Vous devez simplement inclure dans votre projet plusieurs interfaces et plusieurs classes. Dans votre activité, écrivez un code simple et imbriquez votre nouvelle AsyncTask de BaseTask. Je vous conseille également de lire les commentaires car il existe des astuces utiles.
Cela fait quelques années que cette question a été posée (et depuis que quelqu'un a posté une réponse). Depuis lors, ProgressDialog était obsolète dans le niveau 0 de l'API, selon la documentation officielle d'Android. En tant que tel, vous pouvez envisager d’utiliser une barre de progression en ligne au lieu d’un ProgressDialog comme le suggèrent les auteurs de la documentation.
Beaucoup de développeurs ont du mal à écrire une tâche asynchrone au début, en raison de l’ambiguïté des paramètres. La grande raison est que nous essayons de mémoriser les paramètres utilisés dans la tâche Async. La clé est ne pas mémoriser. Si vous pouvez visualiser ce que votre tâche doit réellement faire, alors écrire l'AsyncTask avec la signature correcte serait un jeu d'enfant.
AsyncTask sont des tâches en arrière-plan qui s'exécutent dans le thread en arrière-plan. Il prend une entrée, effectue une progression et donne une sortie.
c'est-à-dire
AsyncTask<Input,Progress,Output>
Déterminez simplement ce que sont vos intrants, vos progrès et vos résultats et vous serez prêt à partir.
Par exemple
Comment
doInbackground()
change-t-il avec les paramètresAsyncTask
?
Comment
doInBackground()
etonPostExecute()
,onProgressUpdate()
sont-ils en relation?
Comment pouvez-vous écrire ceci dans un code?
DownloadTask extends AsyncTask<String,Integer,String>{
@Override
public void onPreExecute(){
}
@Override
public String doInbackGround(String... params)
{
// Download code
int downloadPerc = // calculate that
publish(downloadPerc);
return "Download Success";
}
@Override
public void onPostExecute(String result)
{
super.onPostExecute(result);
}
@Override
public void onProgressUpdate(Integer... params)
{
// show in spinner, access UI elements
}
}
Comment allez-vous exécuter cette tâche dans votre activité?
new DownLoadTask().execute("Paradise.mp3");