开放活动的进度对话框

时间:2010-11-23 08:42:47

标签: android progressdialog

嘿伙计们, 我在打开活动时遇到了进度对话框的问题(在示例中称为活动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显示活动。< / p>

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

一个想法?

4 个答案:

答案 0 :(得分:10)

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

在AsyncTask中有三种重要的方法可以覆盖。

  1. doInBackground :这是你背景的所在 处理将会发生。
  2. onPreExecute :在此处显示您的ProgressDialog(showDialog)
  3. onPostExecute :在此隐藏您的ProgressDialog(removeDialog或dismissDialog )
  4. 如果将AsyncTask子类作为活动的内部类,则可以在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);
      }
    }
    

答案 1 :(得分:3)

GeeXor

我建议你避免在Activity 2的OnCreate中执行大量操作。写OnCreate中的大量操作是活动之间黑屏的原因。所以使用AsyncTask或在线程中异步执行这些操作(或者如果它们是不可避免的,请在 onStart 中写下来。)

另一个建议是在活动2的onCreate中启动另一个progressDialog,它将一直运行,直到你的所有数据都被加载为止。用户将知道背景中正在发生的事情。

答案 2 :(得分:2)

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

我见过使用ViewFlipper打开一个活动的变通方法,在中心有一个进度动画,在下一个View中,它被加载了一个活动,但它不是推荐的东西,很难实现按你的意愿工作

答案 3 :(得分:0)

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