【问题标题】:Show a progress bar when an Activity is loading加载 Activity 时显示进度条
【发布时间】:2011-06-19 12:08:42
【问题描述】:

我有一个ListActivity,它会根据列表选择启动另一个Activity。这第二个Activity 需要从互联网加载相当多的数据,因此在用户单击项目和Activity 显示之间存在明显的延迟。

这是一个问题,因为我目前无法向用户表明他们的点击正在被处理(即使只是更改所选列表项的颜色就足够了,但我找不到这样做的好方法)。理想情况下,我可以在第二个Activity 加载时显示不确定的ProgressDialog

我为此尝试了几种不同的方法,但似乎没有任何效果。


我尝试了以下方法:

  • 在第一个Activity 中的AsyncTask 中检索可序列化数据(不是全部,而是一部分),并将其作为额外数据传递给第二个。这并没有真正奏效,因为我在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();
}
  • 在第二个Activity的onCreate()方法中(这根本不起作用):

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

这是第二种方法的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();
    }
}

【问题讨论】:

  • 您尝试过哪些不同的方法?你能分享一下你的尝试吗?
  • 我很惊讶第一种方法没有奏效。 onPreExecute() 中显示的 ProgressDialog 不应被 doInBackground() 中的代码阻止,也许您的代码存在其他问题?
  • 可能吗?我添加了相关代码..

标签: android android-asynctask progressdialog


【解决方案1】:

如果您有很长的操作,则无论如何都不应该在 onCreate 中执行它们,因为这会冻结 UI(无论是否显示活动)。 onCreate 设置的 UI 不会出现,并且 UI 将在 onCreate 调用完成之前无响应。

看来您可以开始您的第二个活动并显示一个进度条(或requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);),然后启动一个 ASyncTask,一旦检索到数据,它将负责更新您的 UI。

【讨论】:

  • 是的,我认为这是正确的方法(在另一个线程中加载数据),但我现在想避免它..但我硬着头皮这样做了(AsyncTask 使这比它本来的痛苦要少..)
【解决方案2】:

亚当,

听起来您正在寻找不确定的进度条:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html

您可以在加载第二个 Activity 时显示此内容,然后在第二个 Activity 加载其数据后将可见性设置为 false。

【讨论】:

  • 第一个活动的视图停留在屏幕上,直到整个 onCreate() 方法完成,所以我看不到进度条。
  • 你什么时候在onCreate()方法中调用setContentView()
  • 显示进度条之后(应该是?)的第一件事。我已使用此信息更新了原始帖子。
  • 好吧,看起来您将进度条设置为可见,然后在将其设置回不可见后立即显示。
  • 我注释掉了一些检索数据并填充视图的代码(实际上,我创建了一些自定义视图来填充自己的数据..)
【解决方案3】:

将创建 Intent(以及在 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 永远不会有机会出现,直到任务完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多