2011-07-13 6 views
1

私が書いているアプリケーションでは非常に奇妙な問題があります。サービス、AsyncTasks、UIスレッドへのアクセス権について再度誤解していることもあります。サービス、AsyncTasks、CalledFromWrongThreadException

このアプリケーションは、複数の他のアクティビティにナビゲートする主なアクティビティで構成されています。このアプリケーションには、アプリケーションがフォアグラウンドにある間にバックグラウンドで定期的にポーリングするサービスと、ライブラジオストリームをストリーミングするために「AACPlayer」を実行するサービスの2つがあります。

ラジオのUIコントロールを持つアクティビティの1つが、ラジオのサービスを開始します。これを行うには、AsyncTaskを起動してPLSファイルを取得し、最後にストリームの適切なURLでサービスを開始します。 AACPlayerも起動するサービスが開始されます。ストリームの再生が開始されると、ストリームの再生が開始されたというブロードキャストが発行されます。ラジオコントロールを保持するアクティビティのブロードキャスト受信者は、インテントを処理し、UIを更新します。

これは、サービスがUIを更新する意思をブロードキャストする前に、アプリを離れるか、ラジオ画面からバックアウトするという一見ランダムな組み合わせによって、他のすべてのアクティビティが現在外部で実行されているように見えるUIスレッドのこの状態で発生した他のすべてのアクティビティは、それが違法な状態であるという例外を受け取り、UIスレッドで実行されていないので、UIに関連する何かを変更することはできません。通常の犯人例外メッセージは次のとおりです:W/System.err(3818): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

突然、アプリケーション全体が通常のUIスレッドで実行されなくなり、他のすべてのアクティビティでこの例外が報告されていますか?このエラーを引き起こすような違法行為を行っているコードはありません。 AsyncTasks内にUI関連のものはありません。ブロードキャストレシーバー(無線サービスから受信)によってトリガーされるコールバックはUIをタッチしますが、私はこれを行うための別の方法は考えられません。

アプリケーションの強制終了時にも問題は解決されませんが、アプリケーションが強制終了するか、またはAndroidの設定からデータが消去されると、問題は解決されます。

EDIT - ここでは、要求として開始されたサービスおよびサービスを開始活動の概要を説明し、いくつかのコードは、/ UIを制御しています:https://gist.github.com/1080797

任意の考えをいただければ幸いです。ありがとう。

+0

いくつかのコードを追加してください。 – Marmoy

+0

サービスファイルとそのサービスの「責任者」である要点を作成しました。 https://gist.github.com/1080797 – jlindenbaum

答えて

1

PlayerServiceUpdateReceiverの初期化をonCreate()に移動してみてください。私はonResume()ごとにそれを再初期化する必要はないと思うので、再登録する必要があります。分かりますか?

私は、あなたが新しいインスタンスで上書きした受信者にコールバックを取得していると思います。

または私は完全に間違っているかもしれないし、それを行う正しい方法です。私が間違っているなら私を訂正してください。

+0

初期化がonCreateになりました。登録はonResumeに残ります - これは意味ですか? https://gist.github.com/1080797/c473eb5084f53fc22c3a8b25cd136dede9958e0a – jlindenbaum

+0

はい、違いはありますか? – Marmoy

+0

テストするデバイスに置くだけです。それが修正されたかどうかを知ることは難しいでしょう。あるいは、それを再現できません。 ;) あなたはそこに何か違ったやり方をしていますか? – jlindenbaum

関連する問題