【问题标题】:Progress Dialog on open activity开放活动的进度对话框
【发布时间】:2010-11-23 08:42:47
【问题描述】:

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

activity 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 秒结果。

【问题讨论】:

  • 您创建了一个线程来运行在 UI 线程中运行的代码?!这是我需要知道的黑客/解决方法还是这只是错误的?
  • 嘿@WarrenFaith,你能不能给我一个坚实的基础并接受我对这个问题的最高投票答案?
  • @Darren 不是我的问题 :)
  • 我很尴尬...谢谢沃伦 ;)
  • 嘿@Pachanka,你能不能给我一个坚实的基础并接受我对这个问题的最高投票答案?

标签: android progressdialog


【解决方案1】:

我遇到了同样的问题,使用 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);
  }
}

【讨论】:

    【解决方案2】:

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

    我见过一些变通方法,它使用 ViewFlipper 打开一个活动,中间有一个进度动画,在下一个视图中,它被加载了一个活动,但这不是推荐的,也很难实现如你所愿.

    【讨论】:

    • 是的,我在两者上都进行了测试,结果相同,在模拟器上更快,因为我使用所有已安装的应用程序启动了一个活动,而在模拟器上很少。嗯,2个动画不是我希望的行为:/
    【解决方案3】:

    GeeXor

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 嗯,我已经看到许多应用程序带有一个小轮子,例如直接在活动中进行中的对话框(活动中的顶部或底部)。那是什么?
      • 看看Activity.setProgress。有许多选项可用于设置 Activity 标题栏上的小旋转轮。
      • 好的,我在这里找到了解决方案:stackoverflow.com/questions/3893626/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多