显示ProgressDialog的Android方法,运行worker并等待worker完成

时间:2013-04-12 17:02:18

标签: android progressdialog looper

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

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

        final ValueHolder result = new ValueHolder();
        final ProgressDialog progress=new ProgressDialog(c,R.layout.progress_impl_layout);
        Thread main = new Thread(new Runnable(){
            @Override
            public void run() {
                Looper.prepare();//creating new Looper to show progressDialog immediately 
                final Looper looper=Looper.myLooper();
                AsyncTask async = new AsyncTask(){
                    @Override
                    protected void onPostExecute(Boolean result) {
                        super.onPostExecute(result);
                        isDone=true;
                        looper.quit();//quit Looper.loop
                        progress.dismiss();
                    }
                    @Override
                    protected void onPreExecute() {
                        super.onPreExecute();
                        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progress.setTitle(title);
                        progress.setMessage(message);
                        progress.show();
                    }

                    @Override
                    protected Boolean doInBackground(Integer... params) {
                        IProgressImpl progressImpl=new MyProgressImpl(progress);
                        worker.execute(progressImpl, param);
                        return true;
                    }
                };

                async.execute(0);
                if(!isDone){
                    Looper.loop();//show progressDialog immediately
                }
            }
        });
        main.start();
        try {
            main.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result.value;
    }

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

2 个答案:

答案 0 :(得分:1)

如何更新AsyncTask中的Android UI

我建议您使用Activity.runOnUiThread()更新Looper方法的用户界面,例如AsyncTaskProgressDialog,而不是使用show()中的dismiss()runOnUiThread(new Runnable() { @Override public void run() { progress.dismiss(); } });

示例

Context c

如果您的Activity,上面是runOnUiThread()上下文,则可以使用它来访问 c.runOnUiThread()...

Activity

您可能需要通过各种方法为您的处理类提供execute(),例如将其传递到Application方法或使用Android Context实例。

否则,您可以使用常规Runnable,但上述{{1}}必须在线程或任务中执行。

答案 1 :(得分:0)

首先,存储在main变量中的线程不是 main(a.k.a.UI)线程。

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

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

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