3

こんにちは、OnCreate() で呼び出されるアプリケーションに AsyncTask があり、Web 経由でデータを取得し、ダウンロード中に不確定な進行状況バーを表示します。

問題は、アプリを起動すると、AsyncTask が終了するまで画面が空白のままになることです。コードはそのようなものです。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    loadData();
    //Several UI Code   
    startAsyncTasks();
}


 private void startAsyncTasks(){
    new ConnectingTask().execute();
 }
4

1 に答える 1

1

OnCreate() はアクティビティが画面に表示される前に実行されるため、データ ダウンロード プロセス全体がアクティビティを表示する前に実行されます。

解決策は、OnCreate() ではなく OnStart() メソッドで AsyncTask を開始することです (これもオーバーライドされます)。OnStart() は、アクティビティが画面に表示される間に実行されます (アクティビティのライフサイクルを参照)。

これは、私がアプリに実装したケースであり、機能します。OnStart() メソッドで進行状況ダイアログを表示し、適切なタイミングで AsyncTask で更新して閉じる必要があります。

これは私のアプリでどのように見えるかです:

  1. AsyncTask はアクティビティ OnStart() で開始され、ダイアログ ボックスが表示されます
  2. データは AsyncTask を拡張する内部クラスでダウンロードされています
  3. データがダウンロードされた後、ダイアログ ボックスは閉じられ、以降のデータ処理が初期化されます (OnPostExecute())

欠点は、OnStart() が最初のアクティビティ呼び出しで呼び出されるだけでなく、それを復元した後 (たとえば、アプリケーションを最小化した後) にも呼び出されることです。したがって、AsyncTask は OnCreate() とは反対に数回実行できます。これは、アクティビティが作成されたとき (復元されたときではありません) に 1 回だけ呼び出されます。

AsyncTask でダイアログを使用してそのようなアクティビティの jUnit テストを行う場合、いくつかの問題が発生する可能性もあります。そうする場合はお知らせください。解決策を投稿します。

于 2012-03-17T10:16:43.583 に答える