我有ListActivity
根据列表选择启动另一个Activity
。第二个Activity
需要从互联网上加载大量数据,因此用户点击某个项目与显示Activity
之间存在明显的延迟。
这是一个问题,因为我目前无法向用户表明他们的点击正在处理中(即使只是更改所选列表项的颜色就足够了,但我找不到一个好方法来做到这一点)。理想情况下,我可以在加载第二个ProgressDialog
时显示不确定的Activity
。
我为此尝试了几种不同的方法,但似乎没有任何工作可行。
我尝试了以下内容:
AsyncTask
中的Activity
中检索可序列化数据(不是全部而是部分),并将其作为额外内容传递给第二个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();
}
中的处理似乎推迟了),因此效果不佳。以下是代码:
onCreate()
在第二个Activity的onCreate()
方法中(这根本不起作用):
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarVisibility(true);
以下是第二种方法的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();
}
}
方法:
{{1}}
答案 0 :(得分:16)
如果您有长时间操作,则无论如何都不应该在onCreate中执行它们,因为这会冻结UI(无论是否显示活动)。在onCreate调用完成之后,onCreate设置的UI将不会出现,UI将无响应。
您似乎可以开始第二个活动并显示进度条(或requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
),然后启动一个ASyncTask,它将负责在检索到数据后更新您的UI。
答案 1 :(得分: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() blocks直到任务完成。因此,在上面的代码中,UI线程被阻止,并且在任务完成之前,ProgressDialog永远不会有机会出现。
答案 2 :(得分:2)
亚当,
听起来您正在寻找不确定进度栏:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html
您可以在加载第二个Activity
时显示此内容,然后在第二个Activity
加载其数据后将可见性设置为false。