20

リストの選択に基づいて別のListActivityを起動するがあります。Activityこの秒Activityはインターネットからかなりの量のデータをロードする必要があるため、ユーザーがアイテムをクリックしてからActivity表示されるまでに顕著な遅延があります。

現在、クリックが処理されていることをユーザーに示す方法がないため、これは問題です(選択したリスト項目の色を変更するだけで十分ですが、それを行うための適切な方法が見つかりません)。ProgressDialog理想的には、2番目のActivity読み込み中に不確定を表示できるようになります。

私はこれに対していくつかの異なるアプローチを試しましたが、何も期待どおりに機能しないようです。


私は次のことを試しました:

  • AsyncTask最初のでシリアル化可能なデータ(すべてではなく一部)を取得し、Activityそれを追加として2番目に渡します。ProgressDialogで作成しonPreExecute()たものがすぐに表示されなかったため、これは実際にはうまく機能しませんでした(doInBackground()何らかの理由で処理が行われたために遅延したようです)。

そのためのコードは次のとおりです。

AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() {
    Dialog progress;

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(SearchActivity.this, 
                "Loading data", "Please wait...");
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        DatasetReader reader = new DatasetReader();
        reader.setFundID(params[0]);
        reader.addDatsets(FundProfile.datasets);
        reader.populate();
        return reader.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        progress.dismiss();
    }
};
read.execute(selectedItem.getUniqueID());
try {
    action = new Intent(SearchActivity.this, FundProfile.class);
    action.putExtra("data", read.get());
} catch(Exception ex) {
    ex.printStackTrace();
}
  • 2番目のアクティビティのonCreate()メソッド(これはまったく機能しません):

    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setProgressBarVisibility(true);

onCreate()2番目のアプローチの方法は次のとおりです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setTitleColor(Color.WHITE);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setProgressBarVisibility(true);

    try {
        setContentView(R.layout.fund_profile);
        // init some data
        setProgressBarVisibility(false);
    } catch(Exception ex) {
        FundProfile.this.finish();
    }
}
4

3 に答える 3

16

長い操作がある場合は、UIがフリーズするため(アクティビティが表示されているかどうかに関係なく)、onCreateで操作を実行しないでください。onCreateによって設定されたUIは表示されず、onCreate呼び出しが終了するまでUIは応答しなくなります。

2番目のアクティビティを開始してプログレスバー(またはrequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);)を表示し、データが取得されたらUIの更新を担当するASyncTaskを開始できるようです。

于 2011-02-01T20:51:02.137 に答える
3

インテントの作成(およびAsyncTaskの完了後に実行する必要があるすべてのこと)をonPostExecuteに移動します。

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    progress.dismiss();
    Intent action = new Intent(SearchActivity.this, FundProfile.class);
    action.putExtra("data", result);
    // ... do more here
}

問題は、タスクが完了するまでAsyncTask.get()がブロックされることです。したがって、上記のコードでは、UIスレッドがブロックされ、タスクが完了するまでProgressDialogが表示されることはありません。

于 2011-02-02T21:45:12.460 に答える
3

アダム、

不確定なプログレスバーを探しているようです:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html

秒をロードしているときにこれを表示しActivity、秒がデータをロードしたら可視性をfalseに設定Activityできます。

于 2011-02-01T19:10:00.857 に答える