1

ダイアログの XML レイアウトで指定されたいくつかの画像を含むダイアログをロードするアプリケーションがあります。Android でイメージを使用し、VM の予算に注意することについてよく読んだので、かなりの量のメモリを占有する可能性のあるイメージの処理は、メイン スレッドから切り離して処理する必要があると思います。そうは言っても、ASyncTask を使用して UI スレッドからレイアウト全体をロードするのが賢明かどうか疑問に思っていました。私は動作するコードを持っていますが、いくつかの Google 検索でこれが良い習慣であるかどうかを知ることができませんでした. これが以下のコードです。

これは、ユーザーがボタンを押してダイアログをロードしたときにトリガーされる case ステートメントです。

case R.id.showDialog:

    vibrator.vibrate(vibrateMilis);

    mDialog = new Dialog(getActivity(), R.style.CustomDialog);

    new LoadLayout().execute("");

break;

そして、ここに ASyncTask があります

private class LoadLayout extends AsyncTask<String, Void, String> 
{

    ProgressDialog progressDialog;

        @Override
        protected String doInBackground(String... params) 
        {

            mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            mDialog.setContentView(R.layout.dialog_layout);
            mDialog.setCancelable(true);

            return null;
        }

        @Override
        protected void onPostExecute(String result)
        {

            progressDialog.cancel();

            mDialog.show();

        }

        @Override
        protected void onPreExecute() 
        {

            progressDialog = new ProgressDialog(
                    getActivity());
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(false);
            progressDialog.show();

        }

        @Override
        protected void onProgressUpdate(Void... values) 
        {

            // Do nothing

        }

}

したがって、このコードは機能しますが、私が持っている質問はこれです。これは良い習慣と考えられますか? 私の好みでは少しハッキーなようです。複数のGoogle検索でこれに遭遇しなかったので、少し心配です. もしそれが良い習慣だったら、どこかに文書化されていただろうか?

ご意見ありがとうございます。

4

3 に答える 3

2

Android デベロッパー サイトを参照しましたか。あなたのアプローチは間違っています。詳細については、Vogella のドキュメントを参照してください。AsyncTask のわかりやすい説明です。

以下の AsyncTask のサンプル コードも参照してください。

    // The definition of our task class
   private class PostTask extends AsyncTask<String, Integer, String> {
   @Override
   protected void onPreExecute() {
      super.onPreExecute();
      displayProgressBar("Downloading...");
   }

   @Override
   protected String doInBackground(String... params) {
      String url=params[0];

      // Dummy code
      for (int i = 0; i <= 100; i += 5) {
        try {
          Thread.sleep(50);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
         publishProgress(i);
      }
      return "All Done!";
   }

   @Override
   protected void onProgressUpdate(Integer... values) {
      super.onProgressUpdate(values);
      updateProgressBar(values[0]);
   }

   @Override
   protected void onPostExecute(String result) {
      super.onPostExecute(result);
      dismissProgressBar();
   }
   }

それがあなたに大いに役立つことを願っています。

コーディングを楽しんでください... :)

于 2012-11-08T04:04:40.530 に答える
0

私はあなたが間違った方法でそれをやっていると思います:

まず、メソッド doInBackground() を呼び出すと、他のスレッドで実行され、メイン スレッドでのみ UI 要素を変更できます。

第二に、ダイアログが時間を無駄にしないことを示します。onPreExecute() または onPostExecute(String result) で呼び出すことができ、ネットワークやデータベースからデータを取得するなど、ユーザーを待たせる doInBackground() でアクションを実行するだけです。

于 2012-11-08T03:00:17.650 に答える
0

バックグラウンド スレッドでレイアウト全体をロードすることはできません (pls noteAsyncTask.postExecute()はメイン スレッドで実行されます)。Main Threadすべての UI コンポーネントは(UI スレッドとも呼ばれます)からのみ変更する必要があるためです。バックグラウンド スレッドは、UI の表示に必要な情報を収集するためだけに使用できます。

于 2012-11-08T04:19:01.250 に答える