我有一项从 MainActivity 开始的服务:
Intent intent = new Intent(getBaseContext(), MyService.class);
getBaseContext().startService(intent);
在 MyService 中,我创建并启动一个线程,为其提供对服务上下文的引用:
mThread = new MyThread(this);
mThread.start();
然后在线程内部,我想显示一个 ProgressDialog。我试过这个:
mProgressDialog = ProgressDialog.show(mContext,
"", "Receiving file...", true);
mProgressDialog.show();
但我得到“RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序”。这是有道理的,所以我尝试了这个:
HandlerThread progressHandlerThread = new HandlerThread(
"ProgressHandlerThread");
progressHandlerThread.start();
Handler progressHandler = new Handler(
progressHandlerThread.getLooper());
progressHandler.post(new Runnable()
{
@Override
public void run()
{
mProgressDialog = ProgressDialog.show(mContext, "",
"Receiving file...", true);
mProgressDialog.show();
}
});
但我得到“BadTokenException:无法添加窗口令牌不适用于应用程序”,但我不明白该错误的含义。
我已经看到了:从服务内的线程显示 ProgressDialog
并且结论似乎是我需要运行OnUIThread,但是由于我在服务中,因此我没有对活动的引用来执行此操作。谁能解释这个 BadTokenException 并提出一个好的方法来做到这一点?