繁体   English   中英

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

[英]Android method that shows ProgressDialog, runs worker and waits for worker finish

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

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。

如何在AsyncTask中更新Android UI

建议您不要使用AsyncTaskLooper ,而是建议使用Activity.runOnUiThread()更新ProgressDialog方法(例如show()dismiss()的UI。

范例

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

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

    c.runOnUiThread()...

您可能必须通过各种方法(例如,将其传递到execute()方法中或使用Android Application实例execute()使处理类可以使用“ Activity

否则,您可以使用常规Context ,但是上面的Runnable必须在Thread或Task中执行。

首先,存储到线程main变量不是主要 (又名UI)线程。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM