![](/img/trans.png)
[英]Android service worker thread launches activity and waits a response
[英]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
的Looper
,而是建议使用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.