2012-03-13 11 views
2

startServiceを呼び出すサービスとは別のスレッドにあるサービス内でロケーションの更新をリクエストできますか?ロケーションサービス内部サービス

私が試してみました:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

は、それは私にエラーを与え続け:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

が背景マネージャが別のスレッドであるサービス内で実行、またはロケーションマネージャの必要性を行うことができます活動から呼び出されるのか?

答えて

3

メインスレッドで必ずしも更新を受け取る必要はありませんが、有効なLooperを持っていなければなりません。基礎サービスがコールバックを内部Handlerで渡すために使用できる必要があります。本質的には、あなたがこのスレッドにアクティブなLooperがすでに添付されているので、あなたがメインスレッド上のすべてを行うなら、あなたは良いです。

Looperのドキュメントを参照してください。有効なインスタンスでバックグラウンドスレッドを設定する方法を説明していますので、この目的のために使用できます。 のバージョンもあり、Looperというオブジェクトがあります。 requestLocationUpdates()に電話をかけながら、Looper.getMainLooper()の結果を渡して、そのスレッドから直接リスナーを接続できない場合でも、メインスレッドでコールバックを処理できるようにすることができます。

また、位置情報の更新は本質的に非同期であり、そこにコールバックを登録するだけでメインスレッドをブロックしないことに注意してください。これはあなたがこれに興味を持っている理由ではないかもしれませんが、私はそれが言及する価値があると思いました。

HTH

2

私はあなたがこのようにサービスからrequestLocationUpdatesを呼び出す場合ことを発見:あなたはアクティビティからそれを呼び出すかのよう

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLoclistener, Looper.getMainLooper()); 

は、その後、あなたが同じ動作を取得します!

+0

'Looper.getMainLooper()'それを行いました。スレッドの場合は必ず使用してください – msysmilu

関連する問題