我需要编写显示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。
答案 0 :(得分:1)
我建议您使用Activity.runOnUiThread()更新Looper
方法的用户界面,例如AsyncTask
和ProgressDialog
,而不是使用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如果你已经有一个工作线程?你绝对不需要他们两个。