11

私は問題があります。あるアクティビティから別のアクティビティに移動する必要があります。私の 2 番目のアクティビティには大きな xml レイアウトがあり、多くの要素 (約 400 について話している) があり、この 2 番目のアクティビティを表示するのに数秒 (多すぎます) かかります。

2 つのアクティビティの間に進行状況ダイアログを表示するにはどうすればよいですか?

これを行うためにバックグラウンド タスクを使用しようとしています。

アクティビティ A にこのメソッドがあります。

  private void goToYear() {
   Intent intent = new Intent();
   intent.setClass (getBaseContext(), YearActivity.class);
   startActivity( intent);
  }

そして、私のアクティビティ B で:

public class YearActivity extends Activity {

 private String  TAG = "YearActivity ::";

 private ProgressDialog pd = null;


    @Override
    public void onCreate( Bundle savedInstanceState) {
        super.onCreate( savedInstanceState);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working...", "Calculating the screen...", true, false);

        // Start a new thread that will download all the data
        new MakeYearTask().execute();

    }

    private void initCalendar () {
      this.setContentView( R.layout.calendar_year);   

   ...
   ...
   initialize values
   ...
   ...

    }


    private class MakeYearTask extends AsyncTask<String, Void, Object> {
        protected Void doInBackground(String... args) {
            Log.i("YearActivity::MakeYearTask", "MakeYearTask Background thread starting");

   YearActivity.this.initCalendar();


        }

        protected void onPostExecute(Object result) {

            if (YearActivity.this.pd != null) {
             YearActivity.this.pd.dismiss();
            }
        }
   } 
}

メソッドのsetContentViewアウトを作成していることがわかります。onCreate

これはうまくいきません。次のように、1つの例外があります。

12-09 19:49:17.729: ERROR/AndroidRuntime(218): java.lang.RuntimeException: An error occured while executing doInBackground()
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.lang.Thread.run(Thread.java:1060)
12-09 19:49:17.729: ERROR/AndroidRuntime(218): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.checkThread(ViewRoot.java:2629)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewRoot.requestLayout(ViewRoot.java:545)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.View.requestLayout(View.java:7657)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1749)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.view.ViewGroup.addView(ViewGroup.java:1731)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2186)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2239)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.app.Activity.setContentView(Activity.java:1620)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar(YearActivity.java:42)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.access$0(YearActivity.java:41)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:120)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at es.jota.app.YearActivity.initCalendar$MakeYearTask.doInBackground(YearActivity.java:1)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
12-09 19:49:17.729: ERROR/AndroidRuntime(218):     ... 4 more
4

4 に答える 4

1

これは最初から貧弱な設計です。ユーザーに提示する大量のデータがあり、おそらくスクロールされると思われる場合は、代わりに や などのサブクラスを使用する必要がありAdapterViewます。約 400 の要素を持つ XML レイアウトは、信じられないほど大きくなります。ListViewGridView

私はあなたが何をしようとしているのか理解しています (あなたは を使用Viewして別の巨大な階層の長い構築を実行しようとしていますが、あなたが見つけたのは、非 UI )。ThreadAsyncTaskViewThread

階層が構築されている間にフォアグラウンドにある種の進行状況バーを実装できたとしても、システムがView階層を膨らませている間に進行状況情報をコールバックする手段を提供するかどうかはわかりません (しかし、私は間違っているかもしれません)。 )。

AdapterViewはまさにこの種の問題を解決するために作成されました。を使用すると、通常、メモリ内にはAdapterView常に 1 画面分しか存在しません。Viewsたとえば、1,000 行のテーブルを作成できますが、一度に画面に収まる行が 7 行しかなく、一度Viewにメモリ内に存在するのは 8 行だけです。さらに、アダプタはViews もリサイクルして、パフォーマンスをさらに最適化する必要があります。

于 2013-04-02T18:00:40.660 に答える
0

new MakeYearTask().execute();代わりにonResume()でやってみましたか?

エレガントではありませんが、作成時に遅延スレッドポストを起動して、数ミリ待機することができます。

編集:

私はちょうどこのエラーです:

(Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views)

AsyncTaskからUIを変更していますか?

でデータをビルドする必要がありますがdoInBackground()、でUIを更新しonPostExecute()ます。

于 2010-12-09T21:03:34.300 に答える
0

あなたのフォーマットは少しずれていますが、私の理解が正しければ、あなたはinitCalendar()あなたAsyncTaskdoInBackground(). sでそれを行うことは許可されていませんAsyncTask

HTTP 呼び出し、DB アクセスなどの長時間実行される操作に使用します。doInBackground()必要なものが揃ったら、initCalendar()から呼び出しますonPostExecute()

于 2010-12-10T09:43:47.610 に答える
0

これは最善の解決策ではないかもしれませんが、Android で使用される基本的なテーマを拡張し、ウィンドウの背景をアクティビティが読み込まれていることを示す画像に設定することができます。次に、そのテーマをアクティビティ B に設定します。アクティビティ B の読み込み中に、黒いウィンドウではなくドローアブルが表示されます。アニメーション リストを使ってクリエイティブになり、ある種の不確定な読み込み効果を得ることができるかもしれません。

于 2010-12-09T20:40:21.740 に答える