65

HTTPサーバーからRSSフィードを読み込んでいるときに、カスタムの進行状況ダイアログを表示しようとしています。ハード検索を行いましたが、これを行うのに何の役にも立ちませんでした。ソリューションで使用する必要があることだけを知っていますがAsyncTask、混乱しています。これに渡すパラメータAsyncTask。これが私の活動です:

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か。

4

7 に答える 7

128
/**
 * 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;
   }

}
于 2010-12-27T11:30:25.770 に答える
44

ビュー修飾子を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あなたのコードはとても役に立ちました。

于 2010-12-27T13:18:28.273 に答える
9

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();
        }
    }
于 2013-02-02T12:20:28.467 に答える
3

数日前、私はこの問題の非常に良い解決策を見つけました。ここでそれについて読んでください。つまり、MikeはProgressDialogとAsyncTaskを仲介するAsyncTaskManagerを作成しました。このソリューションの使用は非常に簡単です。プロジェクトにいくつかのインターフェースといくつかのクラスを含める必要があり、アクティビティにいくつかの簡単なコードを記述して、BaseTaskから新しいAsyncTaskをネストします。また、役立つヒントがいくつかあるので、コメントを読むことをお勧めします。

于 2012-07-05T08:25:13.060 に答える
3

どのパラメータを使用すべきかわからないのですか?

パラメータがあいまいなため、AsyncTaskの作成を開始するのに苦労している開発者もいます。大きな理由は、AsyncTaskで使用されるパラメーターを記憶しようとすることです。重要なのは暗記しないことです。タスクが実際に何をする必要があるかを視覚化できる場合は、正しい署名を使用してAsyncTaskを作成するのは簡単です。

AsyncTaskとは何ですか?

AsyncTaskは、バックグラウンドスレッドで実行されるバックグラウンドタスクです。入力を受け取り、進行状況を実行し、出力を提供します。

すなわち AsyncTask<Input,Progress,Output>

入力、進行状況、出力が何であるかを理解するだけで、準備が整います。

例えば

ここに画像の説明を入力してください

パラメータによってどのようにdoInbackground()変化しAsyncTaskますか?

ここに画像の説明を入力してください

doInBackground()とはどのようonPostExecute()onProgressUpdate()関連していますか?

ここに画像の説明を入力してください

これをコードでどのように書くことができますか?

 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");
于 2019-01-25T08:52:44.837 に答える
0

この質問が出されてから(そして誰かが回答を投稿してから)数年が経ちました。それ以来、 Androidの公式ドキュメントによると、ProgressDialogはAPIレベルOで非推奨になりました。そのため、ドキュメントの作成者が示唆しているように、ProgressDialogの代わりにインラインプログレスバーを使用することを検討してください。

于 2017-04-25T18:19:20.743 に答える
-2

この質問はすでに回答されており、ここでの回答のほとんどは正しいですが、構成の変更に関する1つの大きな問題を解決するものではありません。より良い方法で非同期タスクを記述したい場合は、この記事https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/をご覧ください。

于 2017-04-28T19:16:46.930 に答える