打开活动时的进度对话框

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的按钮点击事件上执行此代码,我会看到进度,但进度条不会移动,并且在Android显示活动所需的2或3秒钟内,我会看到黑屏。

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


你创建了一个将在UI线程中运行代码的线程?!这是一种需要我知道的黑科技/解决方法还是完全错误的做法? - WarrenFaith
嘿@WarrenFaith,你能不能帮我一下,接受我的最佳答案来回答这个问题? - Darren Hicks
@Darren 不是我的问题 :) - WarrenFaith
真是尴尬啊...谢谢你,Warren ;) - Darren Hicks
嘿@Pachanka,你能不能帮我一下,接受我的最佳答案来回答这个问题? - Darren Hicks
4个回答

10

我遇到了同样的问题,使用异步任务对我起了作用。

在AsyncTask中有三个重要的方法需要重写:

  1. doInBackground: 在这里进行后台处理。
  2. onPreExecute: 这里可以显示您的进度对话框 (showDialog)。
  3. onPostExecute: 这里可以隐藏您的进度对话框 (removeDialog或dismissDialog)。

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

以下是一个示例实现:

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);
  }
}

3

据我所知,你无法在显示进度对话框的情况下预加载任何活动。你是在真实设备上测试还是在模拟器上测试?

我见过一些变通方法,比如打开一个带有进度动画的ViewFlipper的活动,在下一个视图中加载一个活动,但这并不是推荐的方法,并且很难实现想要的效果。


是的,我已经在两个设备上测试过了,结果相同。模拟器更快,因为我启动了一个带有所有已安装应用程序的活动,并且在模拟器上只有少量应用程序。唔,两个动画不是我想要的行为 :/ - Pachanka

3

GeeXor

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

另一个建议是在Activity 2的OnCreate中启动另一个进度对话框,该对话框将一直运行,直到加载所有数据并且用户将知道后台正在发生某些事情。


0

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


嗯,我看过许多应用程序在活动中直接使用类似进度对话框中的小轮子(在活动的顶部或底部)。那是什么? - Pachanka
请查看Activity.setProgress。有许多选项可用于设置在Activity标题栏上的小旋转轮。 - techi.services
好的,我在这里找到了一个解决方案:https://dev59.com/Meo6XIcBkEYKwwoYTS5D - Pachanka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接