ProgressDialog в AsyncTask
Я пытаюсь отобразить пользовательский progressdialog при загрузке rss-канала с http-сервера, я сделал жесткий поиск, но ничего не помогло мне это сделать, единственное, что я знаю, это то, что решение должно использовать AsyncTask, m запутать параметры, чтобы перейти к этой 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);
}
}
}
Не могли бы вы помочь мне добавить AsyncTask к этому?
Спасибо,
Houssem
Ответы
Ответ 1
Исправлено перемещением модификаторов вида в onPostExecute, поэтому фиксированный код:
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, спасибо ваш код был очень полезным.
Ответ 2
/**
* 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;
}
}
Ответ 3
AsyncTask очень полезен!
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();
}
}
Ответ 4
Несколько дней назад я нашел очень хорошее решение этой проблемы. Прочитайте об этом здесь. В двух словах Майк создал AsyncTaskManager, который опосредует ProgressDialog и AsyncTask. Это очень простое решение. Вам просто нужно включить в свой проект несколько интерфейсов и несколько классов, а в своей деятельности напишите простой код и вставьте новую AsyncTask из BaseTask. Я также советую вам читать комментарии, потому что есть полезные советы.
Ответ 5
Прошло несколько лет с тех пор, как был задан этот вопрос (и поскольку кто-то отправил ответ). С тех пор ProgressDialog устарел на уровне API O, согласно официальная документация Android. Таким образом, вы можете рассмотрите встроенный индикатор выполнения, а не ProgressDialog, как предлагают авторы документации.
Ответ 6
Не знаете, какой параметр я должен использовать?
Многие разработчики, в том числе и начинающие, испытывают трудности с написанием AsyncTask из-за неоднозначности параметров. Основная причина в том, что мы пытаемся запомнить параметры, используемые в AsyncTask. Ключ не запоминай. Если вы можете визуализировать, что на самом деле нужно делать вашей задаче, то написание AsyncTask с правильной подписью было бы просто.
Что такое AsyncTask?
AsyncTask - это фоновая задача, которая запускается в фоновом потоке. Он принимает входные данные, выполняет прогресс и выдает выходные данные.
т.е. AsyncTask<Input,Progress,Output>
Просто выясните, каковы ваши Входные данные, Прогресс и Выходные данные, и вам будет хорошо идти.
Например
![enter image description here]()
Как doInbackground()
изменяется с параметрами AsyncTask
?
![enter image description here]()
Как doInBackground()
и onPostExecute()
, onProgressUpdate()
?
![enter image description here]()
Как вы можете написать это в коде?
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
}
}
Как вы будете выполнять эту задачу в своей деятельности?
new DownLoadTask().execute("Paradise.mp3");
Ответ 7
Этот вопрос уже ответил, и большинство ответов здесь верны, но они не решают одну серьезную проблему с изменениями конфигурации. Посмотрите на эту статью https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/, если вы хотите лучше написать задачу async.