1

私のアプリでは、ReactiveLocationProvider を使用してバックグラウンドの位置情報の更新を取得しています。(ライブラリリンク) アプリが最小化されると (onPause に入る)、更新の受信が開始されます。問題なく動作しますが、頻繁に更新したくないという問題があります。たとえば、私のコードでは、ユーザーが 1 km 移動し、少なくとも 10 分 (setFastestInterval) が経過したときに位置更新 (1 つ) を取得することになっている LocationRequest があります。私のログによると、必要以上のアップデートを受け取っています。誰でも理由を知っていますか?

これは、create メソッドの MainActivity の私のコードです。

public class MainActivity extends AppCompatActivity {
LocationRequest request;
ReactiveLocationProvider locationProvider;
Subscription subscription;
Subscription onlyFirstTimeSubscription;
NotAbleToGetWeatherDataTask mNotAbleToGetWeatherDataTask = new NotAbleToGetWeatherDataTask();
int numOfBackgroundUpdates = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //-----------MY CODE STARTS HERE-----------------
    request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setSmallestDisplacement(1000)
            .setFastestInterval(10 * 1000)
            .setInterval(30 * 60 * 1000);
    locationProvider = new ReactiveLocationProvider(this);
}

と私の onPause メソッド:

@Override
protected void onPause() {
    super.onPause();
    //subscribe for background location updates...
    subscription = locationProvider.getUpdatedLocation(request)
            .subscribe(new Action1<Location>() {
                @Override
                public void call(Location location) {
                    Log.d(TAG, "Getting Background updates...");
                    MainActivity.this.latitude = location.getLatitude();
                    MainActivity.this.longitude = location.getLongitude();
                    numOfBackgroundUpdates++;

                }
            });
}

そして、私は破棄時にリクエストから退会しています:

   @Override
protected void onDestroy() {
    Log.d(TAG, "OnDestroy Called!");
    subscription.unsubscribe();
    super.onDestroy();
}

最近のログ (1km 移動して 10 分以上経過)

12-28 17:12:25.564 29845-29845/? D/MainActivity: Getting Background  updates...
12-28 17:16:06.918 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.924 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.925 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.927 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.928 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.930 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.931 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.940 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.942 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.942 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.946 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.949 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates...
12-28 17:16:40.371 29845-29845/? D/MainActivity: Getting Background updates...
4

1 に答える 1

1

最初にこれを調整します:
あなた setFastestIntervalのミリ秒は10 * 1000--> 10 分間、これを行う必要があります:60 * 10 * 1000

次に、これを見て
ください: アプリの期間中、ロケーション プロバイダー クラスのインスタンスを 1 つ作成する必要があります。

ReaciveLocationProviderへのこれらのリンクを見ると、現在のコンテキストがパラメーターとして渡されていることがわかります。

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context);
locationProvider.getLastKnownLocation()
.subscribe(new Action1<Location>() {
    @Override
    public void call(Location location) {
        doSthImportantWithObtainedLocation(location);
    }
});

reactiveLocationProvider = new ReactiveLocationProvider(this);

作成者は、コンテキストをパラメーターとして渡しています。reactiveLocationProviderのすべてのインスタンスを調べて、単一のインスタンスを作成することをお勧めします。

そのため、getapplicationcontext を使用するか、以下で提案する同様の方法を使用して、静的な最終コンテキストを作成します。

例:(これは私のライブラリから取られています

LocationManager locationManager = (LocationManager) getSystemService(_CONTEXT);

私のカスタム クラスの例では、最終的なコンテキストを渡します。

public class LocFinder extends Service implements LocationListener {
    private final Context mContext;

    public LocFinder(Context context) {
        this.mContext = context;
    }

github コードをより徹底的に調べないと、作成者がこれに対して安全に保護されているかどうかを判断するのは困難ですが、そのように oncreate で MainActivity から呼び出している場合は、新しいリクエストを作成している可能性があります。

  request = LocationRequest.create()

また、OnPause の場所も尋ねています。

MainActivity.this.latitude = location.getLatitude();
MainActivity.this.longitude = location.getLongitude();

これを行う必要性については、100% 明確ではありません。

finalまた、locationrequest を作成する際に元の作成者が を使用したことにも注意してください。これは、アプリの存続期間中のリクエスト呼び出しを制御するという考えをサポートしています。

さらに助けが必要な場合は大声で言ってください。

于 2015-12-28T15:47:16.570 に答える