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



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

公共静态输出执行(最后的上下文c,最后的字符串标题,最后的字符串消息,最后的IProgressWorker worker,最后的TIn参数){final ValueHolder result = new ValueHolder();final ProgressDialog progress=new ProgressDialog(c,R.layout.progress_impl_layout);线程main = new Thread(new Runnable()){@Override公共无效运行(){loop .prepare();//创建新的loop以立即显示progressDialogfinal loop = loop . myloop ();AsyncTask = new AsyncTask(){@OverrideonPostExecute(Boolean result) {super.onPostExecute(结果);结束= true;looper.quit ();//Looper.loop辞职progress.dismiss ();}@OverrideonPreExecute() {super.onPreExecute ();progress.setProgressStyle (ProgressDialog.STYLE_HORIZONTAL);progress.setTitle(标题);progress.setMessage(消息);progress.show ();}@Override保护布尔doInBackground(整数…params) {IProgressImpl progressImpl=new MyProgressImpl(progress);工人。执行(progressImpl参数);返回true;}};async.execute (0);如果(结束){loop .loop();//立即显示progressDialog}}});main.start ();尝试{main.join ();} catch (InterruptedException e) {//TODO自动生成捕获块e.printStackTrace ();}返回result.value;} 之前

一切工作,但ProgressDialog不解散。我怀疑loop .quit()做了一些坏事,但我需要停止loop .loop()。我调用loop(),因为我需要立即显示ProgressDialog。

如何在AsyncTask中更新Android UI

而不是在你的AsyncTask中使用Looper,我建议你使用Activity.runOnUiThread()来更新你的ProgressDialog方法的UI,如show()dismiss()

:

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

如果上面的Context cActivity上下文,则可以使用它来访问runOnUiThread():

    c.runOnUiThread()...

你可能必须通过各种方法使Activity对你的处理类可用,例如将其传递到你的execute()方法或使用Android Application实例。

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

首先,存储在main变量中的线程不是主(即UI)线程。

对于runOnUIThread(),你可以在UI线程上创建一个Handler, post(Runnable r)postDelayed(Runnable r, long delayMillis)将取代runOnUIThread()。[或者,你的函数已经有一个Context参数;你可以要求它是一个活动。]

还请注意,在Android 2中,在线程上初始化AsyncTask类而不是在UI线程上初始化会导致错误。

最后,为什么你需要一个单独的线程,如果你使用AsyncTask?或者为什么AsyncTask如果你已经有一个工作线程?

最新更新