web-dev-qa-db-ja.com

アクティビティの読み込み中に進行状況バーを表示する

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

現在、クリックが処理されていることをユーザーに示す方法がないため、これは問題です(選択したリストアイテムの色を変更するだけでも十分ですが、適切な方法を見つけることができません)。理想的には、2番目のProgressDialogがロードされている間、不確定なActivityを表示できます。

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


私は以下を試しました:

  • 最初のAsyncTaskActivityにあるシリアル化可能データ(すべてではなく一部)を取得し、2番目のデータに追加として渡します。これは、onPreExecute()で作成したProgressDialogがすぐに表示されなかったため、実際にはうまく機能しませんでした(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);

次に、2番目の方法のonCreate()メソッドを示します。

_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();
    }
}
_
20
Adam

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

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

16
Damp

インテントの作成、および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が表示される機会が与えられることはありません。

3
Mike

アダム、

不確定な進行状況バーを探しているようです: http://developer.Android.com/resources/samples/ApiDemos/src/com/example/Android/apis/view/ProgressBar2.html

2番目のActivityのロード中にこれを表示し、2番目のActivityがデータをロードしたら、可視性をfalseに設定できます。

2
Will Tate