0

我在这里搜索了大多数“progressDialog not working”线程,但似乎没有一个答案对我有用。

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

public class FLActivity extends ListActivity {

    private ProgressDialog mProgressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mProgressDialog = ProgressDialog.show(FLActivity.this, "", 
                                              "Loading...");

        OtherClass.LongDurationMethodWhichStartsAWorkedThread();

        mProgressDiagog.dismiss();
    }
}

长期的方法是:

// 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() 等待工作线程执行然后继续。

但是,不会显示任何消息。

任何人都可以看到问题吗?

4

2 回答 2

1

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

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

这个页面很好地概述了如何实现它,虽然它肯定不是唯一的选择,谷歌搜索“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
     }
}
于 2012-07-14T15:20:38.733 回答
1

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

  1. 使用AsyncTask在后台运行繁重的操作,比创建自己的线程并与 UI 线程同步更容易
  2. 在Activity.onCreateDialog辅助方法中创建所有对话框并使用 Activity.showDialog 显示它们,这将帮助您处理配置更改。
于 2012-07-14T15:26:54.120 回答