在后台获取过于频繁的位置更新
Getting too frequent location updates in the background
在我的应用程序中,我使用 ReactiveLocationProvider 来获取后台位置更新。 (库 link)当我的应用程序最小化(进入 onPause)时,它开始接收更新。它工作正常,但问题是我不希望频繁更新。例如,在我的代码中,我有一个 LocationRequest supposed 以在用户移动 1km 并且至少 10 分钟 (setFastestInterval) 过去时获取位置更新(一次)。根据我的日志,我收到的更新比需要的多。有人知道为什么吗?
这是我在 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();
}
最近的日志(我已经移动了 1 公里并且至少过去了 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...
首先调整这个:
你的 setFastestInterval
以毫秒为单位 10 * 1000
-->
你需要花 10 分钟做这个:60 * 10 * 1000
然后看看这个:
您需要在应用运行期间创建一个位置提供程序实例 class:
如果您查看 these links to the 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);
我的自定义示例 class 我传递了最终上下文:
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
。这支持在应用程序的生命周期内控制您的请求调用的想法。
如果您需要更多帮助,请大声说出来。
在我的应用程序中,我使用 ReactiveLocationProvider 来获取后台位置更新。 (库 link)当我的应用程序最小化(进入 onPause)时,它开始接收更新。它工作正常,但问题是我不希望频繁更新。例如,在我的代码中,我有一个 LocationRequest supposed 以在用户移动 1km 并且至少 10 分钟 (setFastestInterval) 过去时获取位置更新(一次)。根据我的日志,我收到的更新比需要的多。有人知道为什么吗?
这是我在 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();
}
最近的日志(我已经移动了 1 公里并且至少过去了 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...
首先调整这个:
你的 setFastestInterval
以毫秒为单位 10 * 1000
-->
你需要花 10 分钟做这个:60 * 10 * 1000
然后看看这个:
您需要在应用运行期间创建一个位置提供程序实例 class:
如果您查看 these links to the 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);
我的自定义示例 class 我传递了最终上下文:
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
。这支持在应用程序的生命周期内控制您的请求调用的想法。
如果您需要更多帮助,请大声说出来。