Android ProgressDialog不工作。创建新活动时

Android ProgressDialog不工作。创建新活动时,android,Android,我在这里搜索了大多数“progressDialog不工作”线程,但没有一个答案对我有效 我正在尝试创建一个新的活动,该活动调用在不同线程上执行的方法(最多需要30-5秒) 长期法是: // in some other class public static LongDurationMethodWhichStartsAWorkedThread() { Runnable r = new FFThread(); Thread thread = new Thread(r); t

我在这里搜索了大多数“progressDialog不工作”线程,但没有一个答案对我有效

我正在尝试创建一个新的活动,该活动调用在不同线程上执行的方法(最多需要30-5秒)

长期法是:

// in some other class
public static LongDurationMethodWhichStartsAWorkedThread() {
    Runnable r = new FFThread();
    Thread thread = new Thread(r);

    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch  (Exception e) {
        e.printStackTrace();
    }
}
我使用thread.join()等待工作线程执行,然后继续

但是,不显示任何消息


有人看到问题了吗?

LongDurationMethodWhichStartsAWorkedThread()
将立即返回,因为启动线程不是阻塞调用。因此,可能发生的情况是,您的进度对话框正在显示,然后几乎立即清除,这使您认为它根本没有显示

相反,您应该使用Thread/Handler或来实现长时间运行的操作并显示用户进度

关于如何实现它,虽然这肯定不是唯一的选择,但谷歌搜索“AsyncTask示例”将为您提供大量选择

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // perform long running operation operation
        return null;
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(String result) {
        // execution of result of Long time consuming operation
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
    // Things to be done before execution of long running operation. For example showing ProgessDialog
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onProgressUpdate(Progress[])
     */
    @Override
    protected void onProgressUpdate(Void... values) {
      // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog
     }
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//执行长时间运行操作
返回null;
}
/*(非Javadoc)
*@see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@凌驾
受保护的void onPostExecute(字符串结果){
//执行耗时较长的操作的结果
}
/*(非Javadoc)
*@see android.os.AsyncTask#onPreExecute()
*/
@凌驾
受保护的void onPreExecute(){
//在执行长时间运行的操作之前要做的事情。例如显示ProgessDialog
}
/*(非Javadoc)
*@请参阅android.os.AsyncTask#onProgressUpdate(Progress[])
*/
@凌驾
受保护的void onProgressUpdate(void…值){
//正在执行长时间运行的操作时要执行的操作。例如更新ProgessDialog
}
}

问题在于,当您从主线程调用thread.join()时,您的UI线程被阻塞。所以它不能向您显示任何对话框,因为它只是在等待您的工作线程何时完成。我可以向你推荐两件事:

  • 用于在后台运行繁重的操作,这比创建自己的线程并将其与UI线程同步要容易
  • 在helper方法中创建所有对话框,并使用Activity.showDialog显示它们,这将帮助您处理配置更改

  • 嗨,蒂姆。我在几个小时前读到,对于需要几秒钟以上的操作,没有指示使用AsyncTask。我的需要超过30秒。你认为这会是一个问题吗?我从来没有见过这样的东西,你能链接到你读它的地方吗?
    private class LongOperation extends AsyncTask<String, Void, String> {
    
        @Override
        protected String doInBackground(String... params) {
            // perform long running operation operation
            return null;
        }
    
        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(String result) {
            // execution of result of Long time consuming operation
        }
    
        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPreExecute()
         */
        @Override
        protected void onPreExecute() {
        // Things to be done before execution of long running operation. For example showing ProgessDialog
        }
    
        /* (non-Javadoc)
         * @see android.os.AsyncTask#onProgressUpdate(Progress[])
         */
        @Override
        protected void onProgressUpdate(Void... values) {
          // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog
         }
    }