Tab键切换期间的进度对话框

时间:2011-05-27 18:10:23

标签: java android

当用户从选项卡A切换到选项卡B时需要很长时间(6秒),因此我输入了一个进度对话框,让用户知道应用程序正在处理它。时间表如下:

  1. 活动B onCreate - 创建ProgressDialog并将长任务放在后台线程中。
  2. 活动B onStart
  3. 活动B onResume
  4. 活动B出现在屏幕上
  5. 这一切都很好用一个“次要的”snafu-应用程序间歇性崩溃,因为onResume函数引用了由后台线程创建的东西。换句话说,这是一种典型的竞争条件。

    为了修复竞争条件,我在onResume上的引用之前对线程进行了“连接”,但这使得进度对话框在后台线程完成之前不会显示(即它显示一瞬间然后显示消失了)应用程序就像在后台线程工作时挂起一样。显然,在onResume完成之前,进度对话框才会显示。

    我的问题是:如何在不崩溃程序的情况下显示ProgressDialog?或者我是否需要从onResume中获取违规引用或者使用挂起的应用程序?

3 个答案:

答案 0 :(得分:0)

我最终使用了kludgey解决方案,其中onResume函数等待它需要的中间结果,但不是整个后台线程完成。我知道,这很难看,但似乎有效。

我认为,更好的长期解决方案是将所需对象的创建与创建时所执行的长初始化步骤分开。时间表将是:

  1. 的onCreate
  2. 创建对象
  3. 创建进度对话框
  4. 创建后台线程,让它做对象的长时间初始化。
  5. 在onStart
  6. onResume(没有检查/睡眠循环)。

答案 1 :(得分:-1)

您使用的是Java平台提供的线程,还是使用Android便捷类?

我指的是AsyncTask。很可能你在不方便的时候遇到Ru​​nnables发布的问题。 AsyncTask类很好地打包了这些功能。子类AsyncTask,指定参数,进度和结果的类型。然后,在onPostExecute方法中执行后台工作时,使用doInBackground方法隐藏对话框。

示例代码:

AsyncTask<Void, Void, Void> parseTask = new AsyncTask<Void, Void, Void>() {

    @Override
    protected void onPostExecute(Void result) {
        // Dismiss the progress dialog
        dismissDialog(PROGRESS_DIALOG);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Do background work                
        return null;
        }
};

// Start the background thread
parseTask.execute();

取自实时代码库。也不要感觉太糟糕,并发编程很容易成为编程难度较大的系统之一。很有希望你能够识别和识别竞争条件。

答案 2 :(得分:-1)

一个肮脏的解决方案是为步骤1和2创建一个ProgressDialog,然后为步骤3和4创建第二个相同的进度。