加载活动时显示进度条

时间:2011-02-01 19:05:03

标签: android android-asynctask progressdialog

我有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}}

3 个答案:

答案 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。