Android:ProgressDialog 的问题

标签 android multithreading

亲爱的 Android 黑客, 我正在尝试在我的 Android 应用程序中执行以下操作:当用户单击 ListActivity 中的列表项时,应该显示 ProgressDialog,应该进行一些预加载,完成后,应该使用 Intent 调用另一个 Activity。

我尝试了不同的方法。根本不起作用的是使用异步任务。显然,如果该类不是我的原始 Activity 的成员,我无法从异步任务中显示、关闭或编辑我的 ProgressDialog。

然后我切换到一个简单的线程,这就是我尝试这样做的方式:

dialog = ProgressDialog.show(BookmarkActivity.this, "", "Loading...",true);
new Thread() {
    public void run() {
        // do something
        dialog.setMessage("Change Message...");
        // do more
        dialog.dismiss();
        // ...
        Intent intent = new Intent(BookmarkActivity.this, ThreadActivity.class);
        BookmarkActivity.this.startActivity(intent);
    }
}.start();

这几乎可以工作,但对话框消息的更改不会。我收到有关“泄漏的窗口”的错误消息。 (如果需要,我可以发布完整的日志)。

我的问题:

  • 如果类有自己的文件,我如何为此使用异步任务?
  • 如何从我的线程或 AsyncTask 中更改 ProgressDialog 而不会导致在另一个线程中更改 UI 时出错?

提前致谢,简·奥利弗


好的,在 Jason 的帮助下,我将这个异步任务组合在一起。 有效!

public class ThreadPreLoader extends AsyncTask<Object, String, Void> {

    private Activity mActivity;
    private ProgressDialog mDialog;

    public ThreadPreLoader(Activity activity) {
        mActivity = activity;
    }

    protected void onPreExecute() {
        mDialog = new ProgressDialog(mActivity);
        mDialog.setMessage("Loading...");
        mDialog.show();
    }

    protected Void doInBackground(Object... args) {
        publishProgress("Loading something else..");
        return null;
    }

    protected void onProgressUpdate(String... msg) {
        mDialog.setMessage(msg[0]);
    }

    protected void onPostExecute(Void result) {
        mDialog.dismiss();
    }
}

再次感谢杰森。

最佳答案

您应该使用 Async Task,定义一个自定义 Async Task,它接收原始 Activity 的上下文 (this)。 然后保留该上下文以供以后关闭对话框。 从您的 doInBackground() 方法中,您可以调用 postProgress( int progress) 这将导致 onProgressUpdate()async 中被调用task ,该方法在UI线程上,不会造成跨线程错误。 一旦 doInBackground() 完成,方法 onComplete() 也将在 UI 线程上调用,这是您可以使用保存的上下文并关闭对话框的地方(context.dissmissDialog()

关于Android:ProgressDialog 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172461/

相关文章:

c++ - 如何在 C++ 中实现交换器(会合模式)?

java - 如何取消android studio中的特定线程?

python - 你如何终止/中断/中止 Python 控制台/sys.stdin readline()?

java - 由于 AsyncTask onPostExecute(),ArrayAdapter<String> 中出现 Android NullPointerException

android - 机器人框架 - Appium 库 : Security Exception while starting the application

multithreading - 具有 CPU 绑定(bind)例程的多线程?

c - 二进制信号量保持并发

javascript - Android:有没有办法从我的应用程序执行 JavaScript?

android - SoundCloud HTML5 Widget API - 在 Chrome for Android 中无法播放

android - 位图大小超出 VM 预算,不明白为什么