リストの選択に基づいて別のListActivity
を起動するActivity
があります。この2番目のActivity
はインターネットからかなりの量のデータをロードする必要があるため、ユーザーがアイテムをクリックしてからActivity
が表示されるまでの間に顕著な遅延があります。
現在、クリックが処理されていることをユーザーに示す方法がないため、これは問題です(選択したリストアイテムの色を変更するだけでも十分ですが、適切な方法を見つけることができません)。理想的には、2番目のProgressDialog
がロードされている間、不確定なActivity
を表示できます。
私はこれについていくつかの異なるアプローチを試しましたが、期待どおりに機能するようには見えません。
私は以下を試しました:
AsyncTask
のActivity
にあるシリアル化可能データ(すべてではなく一部)を取得し、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();
}
}
_
長い操作がある場合は、onCreateでそれらを実行しないでください。これにより、UIがフリーズします(アクティビティが表示されるかどうかに関係なく)。 onCreateで設定されたUIは表示されず、onCreate呼び出しが完了するまで、UIは応答しなくなります。
2番目のアクティビティを開始して進行状況バー(またはrequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
)を表示し、データが取得されたらUIを更新するASyncTaskを開始できるようです。
インテントの作成、および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が表示される機会が与えられることはありません。
アダム、
不確定な進行状況バーを探しているようです: http://developer.Android.com/resources/samples/ApiDemos/src/com/example/Android/apis/view/ProgressBar2.html
2番目のActivity
のロード中にこれを表示し、2番目のActivity
がデータをロードしたら、可視性をfalseに設定できます。