2

私はアプリケーションのFusedLocationProvider APIを使用しています。ユーザーが常時移動していることが予想されるため、デバイスの位置は定期的に更新されるはずです。また、現在のデバイスの位置によってアプリの動作が異なる必要があります。AsyncTaskLoaderを使用してロケーションデータUIを更新しますか?

メインスレッドをネットワーク要求から解放するために、私は場所データを取得するためのコードを別のローダーに移したかったのです。しかし、私はこのコードの一部置くために何の手がかりもない:私はLoaderClassに入れた場合

locationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(UPDATE_INTERVAL) 
      .setFastestInterval(FASTEST_INTERVAL); 


     try{ 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this); 
     }catch (SecurityException a){Log.w(TAG,"No location permission.");} 

をしてloadInBackground()でこのメソッドを呼び出すと、エラーもjava.lang.NullPointerException: Calling thread must be a prepared Looper thread.

それはあるだろうローダーに何度も何度も電話するのは間違っているようです。 私の質問は、ローダーを使ってrequestLocationUpdatesを実装して、onLoadFinished()で取得して対応するUIを更新できる変更された場所をローダーが更新できるようにする方法です。そして、オーバーライドする必要があるLocation ListenerのonLocationChanged()メソッドで何をすればよいでしょうか?または、FusedLocationProviderをバックグラウンドスレッドに移動する別の効果的な方法がありますか?

誰かが私をここで助けることができれば本当に素晴らしいだろう。

答えて

2

また、FusedLocationProviderをバックグラウンドスレッドに移動する別の効果的な方法がありますか?誰かがここで私を助けることができれば本当に素晴らしいだろう、多くのありがとう!

バックグラウンドスレッドでロケーションアップデートを受信したい場合は、メソッドのLooperバージョンを使用できます。その場合

requestLocationUpdates(GoogleApiClient, LocationRequest, LocationListener, Looper)

onLocationChanged方法は、ルーパーの糸にトリガされます。

private HandlerThread mLocThread; 
private void initThread(){ 
    mLocThread = new HandlerThread("locationThread"); 
    mLocThread.start(); 
} 

private void requestLocUpdates(){ 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
    locationRequest, this, mLocThread.getLooper()); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // locationThread thread 
} 
+0

お返事ありがとうございます!私は本当にアンドロイドで経験したことがないことを残念に思うので、私はルーパー糸が私の場合には何かを理解していません。つまり、新しいバックグラウンドスレッドを作成する必要がありますか? – sybilcut

+1

はい、あなたは正しいですが、これらのトピックは単なるコメントに記述できるものではありません。私は良いアイデアを与えるために答えを更新しました。この[link](https://blog.nikitaog.me/2014/10/11/android-looper-handler-handlerthread-i/)で、スレッドとルーパーが何であるかを知ることができます。 – Blackkara

+0

私があなたに与えたリンクやその他のチュートリアル/ドキュメントは読んでいますが、まだ不明な点がいくつかあります:OnLocationChanged()をオーバーライドする実行可能ファイルを作成する必要がありますか?または、例えば、上記のrunnableで書いたrequestLocUpdates? – sybilcut

関連する問題