6

我在打开活动(在示例中称为活动 2)时的进度对话框有问题。

活动 2 在这个 OnCreate 事件中有很多代码要执行。

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showApps();
            }
        });
        myProgressDialog.dismiss();
    }
}.start(); 

showApps 函数启动活动 2。

如果我在活动 1 上的按钮单击事件上执行此代码,我会看到进度,但她没有移动,并且在 2 或 3 秒内我有一个黑屏,这是 android 显示活动的时间。

如果我在 Activity2 的 OnCreate 中执行此代码,并且如果我用 OnCreate 上的代码替换 showApps,则 Activity1 冻结 2 秒,我看不到进度对话框,并在看到结果之前在 Activity 2 上再次冻结 2 秒。

4

4 回答 4

10

我有同样的问题,使用AsyncTask对我有用。

在 AsyncTask 中有 3 个重要的方法可以覆盖。

  1. doInBackground:这是您的后台处理的主要内容。
  2. onPreExecute:在此处显示您的 ProgressDialog ( showDialog )
  3. onPostExecute:在此处隐藏您的 ProgressDialog(removeDialog 或 dismissDialog)

如果将 AsyncTask 子类作为 Activity 的内部类,则可以从 AsyncActivity 中调用框架方法 showDialog、dismissDialog 和 removeDialog。

这是 AsyncTask 的示例实现:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}
于 2011-01-11T00:49:12.407 回答
3

AFAIK 您无法预加载任何显示进度对话框的活动。您是在真实设备上还是在模拟器中进行测试?

我已经看到了使用 ViewFlipper 打开一个活动的解决方法,该活动在中心有一个进度动画,在下一个视图中,它被加载了一个活动,但这不是推荐的,也很难实现如你所愿。

于 2010-11-23T09:18:58.067 回答
3

极客

我建议您避免在 Activity 2 的 OnCreate 中执行大量操作。在 OnCreate 中写入大量操作是导致活动之间出现黑屏的原因。因此,使用AsyncTask或在线程中异步执行这些操作(或者如果它们在onStart中写入它们是不可避免的)。

另一个建议是在活动 2 的 onCreate 中启动另一个 progressDialog,它将一直运行,直到您的所有数据都被加载并且用户会知道后台发生了一些事情。

于 2010-11-23T12:21:29.690 回答
0

这就是我要做的。在 ui 线程上创建处理程序,启动后台处理线程,然后显示进度对话框。当后台线程完成它的工作时,让它通过处理程序在 ui 线程上发布一个可运行以关闭对话框。

于 2010-11-23T12:36:13.257 回答