[Android] progressDialog在AsyncTask中


Answers

通過將視圖修飾符移動到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,thx你的代碼是非常有幫助的。

Question

我試圖顯示一個自定義progressdialog加載rss飼料從http服務器,我做了一個艱難的搜索,但沒有什麼幫助我做到這一點,我知道的唯一的解決方案應該使用AsyncTask,但我很困惑params傳遞給這個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







幾天前,我發現了這個問題的一個非常好的解決方案。 在這裡閱讀。 用兩個詞Mike創建了一個調解ProgressDialog和AsyncTask的AsyncTaskManager。 使用這個解決方案非常簡單。 你只需要在你的項目中包含幾個接口和幾個類,並在你的活動中寫一些簡單的代碼,並從BaseTask嵌套你的新的AsyncTask。 我也建議你閱讀評論,因為有一些有用的提示。