私は愚かな要件のように思えるものを持っている:UIスレッドでメソッドを呼び出すときにサービススレッドをブロックすることはできますか?
私はUIスレッドからアクセスされなければならない一つの方法を実行している間、私は私のIntentServiceスレッドをブロックする必要があります。これどうやってするの?
Handler
でLooper.getMainLooper()
を使用してUIメソッドを実行できますが、もちろん残りのサービス処理は続行されます。
もう少し詳細:
マイサービス同期のコンテンツ徐々に新しいアイテムでUIを更新するために、バインダーのコールバックを使用しています。アイテムのリストに影響を与えるすべてのメソッドは、StaggeredGridLayoutがConcurrentModificationExceptionsを投げるのを避けるためにUIスレッドにバインドされています。
しかし、サービスの開始時に、各コンテンツソースを同期する前に、現在のIDを取得するためにリストを呼び出す必要があります。これはUIスレッドアクセスが必要です。
サービスを開始するときに私がこのリストを提供するだけの理由がないのは、アプリが応答し続ける必要があるということです(つまり、同期するとアイテムを削除することができます)
ソリューション同期さ:
を私が思いついた最善の解決策は、他のすべてのために2つのハンドラ、UIメソッドの主なルーパーの1、その他を作成し、それらの間でメッセージを送信することです。許容できるクリーンなソリューションのようには感じられません
もう1つは、同じUIメソッドのスレッドセーフバージョンを作成し、まずコンテンツの配列コピーを行い、コピーでループします。私はバグを引き起こすのが難しいので、arraycopy操作が安全でない(ConcurrentModificationExceptionになりやすい)かどうかはわかりません。だから私はこれも受け入れられるかどうかはわかりません。
通常、サービススレッド*はUIスレッドです。 –
これはIntentServiceなので、私は –
が 'synchronized'ブロックのリストにアクセスするメソッドをラップすることを明確にしておく必要があります – nandsito