0

我需要编写显示 ProgressDialog 的静态方法,在线程中运行 worker 并且在 worker 完成后 ProgreesDialog 必须关闭并且我的方法返回 worker 所做的。这是我的代码:

public static TOut execute(final Context c, final String title, final String message, final IProgressWorker worker, final TIn param)
{

        最终 ValueHolder 结果 = 新 ValueHolder();
        最终 ProgressDialog 进度=新 ProgressDialog(c,R.layout.progress_impl_layout);
        线程主 = 新线程(新可运行(){
            @覆盖
            公共无效运行(){
                Looper.prepare();//创建新的Looper以立即显示progressDialog
                最终 Looper looper=Looper.myLooper();
                AsyncTask async = new AsyncTask(){
                    @覆盖
                    受保护的无效onPostExecute(布尔结果){
                        super.onPostExecute(结果);
                        完成=真;
                        looper.quit();//退出 Looper.loop
                        progress.dismiss();
                    }
                    @覆盖
                    受保护的无效onPreExecute(){
                        super.onPreExecute();
                        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progress.setTitle(title);
                        进度.setMessage(消息);
                        进度.show();
                    }

                    @覆盖
                    受保护的布尔doInBackground(整数...参数){
                        IProgressImpl progressImpl=new MyProgressImpl(progress);
                        worker.execute(progressImpl, param);
                        返回真;
                    }
                };

                async.execute(0);
                如果(!完成){
                    Looper.loop();//立即显示progressDialog
                }
            }
        });
        main.start();
        尝试 {
            main.join();
        } 捕捉(InterruptedException e){
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        返回结果。值;
    }

一切正常,但 ProgressDialog 不会解雇。我怀疑 looper.quit() 做错了什么,但我需要停止 Looper.loop()。我调用 loop() 因为我需要立即显示 ProgressDialog。

4

2 回答 2

1

如何在 AsyncTask 中更新 Android UI

我建议您使用Activity.runOnUiThread()来更新 UI,而不是Looper在您的方法中使用和。AsyncTaskProgressDialogshow()dismiss()

示例

runOnUiThread(new Runnable() {
    @Override
        public void run() {
        progress.dismiss();       
    }
});

如果你的Context c,上面,是一个Activity上下文,你可以使用它来访问runOnUiThread()

    c.runOnUiThread()...

您可能必须Activity通过各种方法为您的处理类提供可用的方法,例如将其传递到您的execute()方法或使用 AndroidApplication实例。

否则,您可以使用常规的Context,但Runnable上面的相同必须在线程或任务中执行。

于 2013-04-12T17:07:30.973 回答
0

首先,存储到变量中的线程不是main主(也就是 UI)线程。

至于runOnUIThread(),您可以在 UI 线程上创建一个处理程序,post(Runnable r)并将postDelayed(Runnable r, long delayMillis)替换runOnUIThread(). [或者,您的函数已经有一个 Context 参数;你可以要求它是一个活动。]

另请注意,在 Android 2 中,在 UI 线程以外的线程上初始化 AsyncTask 类会导致错误。

最后,如果您使用 AsyncTask,为什么需要一个单独的线程?或者,如果您已经有一个工作线程,为什么要使用 AsyncTask?你绝对不需要他们两个。

于 2013-04-12T17:28:14.833 回答