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: Unable to add window token is not for an application」が表示されますが、そのエラーの意味がわかりません。
私はこれを見ました:サービス内のスレッドから ProgressDialog を表示する
結論は、私はrunOnUIThreadを実行する必要があるということですが、サービスにいるので、それを行うためのアクティビティへの参照がありません。誰でもこの BadTokenException を説明し、これを行う良い方法を提案できますか?