por*_*der 8 multithreading android geolocation android-looper
我曾经使用过FusedLocationApi,直到我得知它已被弃用(参见下面的参考资料).实施起来很简单.正如文档所说,您需要将其与GoogleApiClient结合使用
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
locationRequest, this);
Run Code Online (Sandbox Code Playgroud)
我最近更改为FusedLocationProviderClient(参见下面的参考资料)根据教程,我能够成功地使FusedLocationProviderClient工作
教程:https://github.com/codepath/android_guides/wiki/Retrieving-Location-with-LocationServices-API
// new Google API SDK v11 uses getFusedLocationProviderClient(this)
getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
// do work here
onLocationChanged(locationResult.getLastLocation();
}
},
Looper.myLooper());
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Looper线程.即使应用程序在后台运行,Looper线程也会继续运行.我想在应用程序在后台时暂停位置更新,然后在应用程序位于前台时恢复位置更新.我怎样才能做到这一点?
参考文献:
Dan*_*ent 23
你只需要调用mFusedLocationClient.removeLocationUpdates(mLocationCallback)在onPause()你的活动.但是,它还有一点不止于此.
在主活动中使用FusedLocationProviderClient,GoogleApiClient和LocationRequest的成员变量:
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
public class MainActivity extends AppCompatActivity
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
FusedLocationProviderClient mFusedLocationClient;
LocationRequest mLocationRequest;
//..........
Run Code Online (Sandbox Code Playgroud)
也为LocationCallback使用成员变量:
LocationCallback mLocationCallback = new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
for (Location location : locationResult.getLocations()) {
Log.i("MainActivity", "Location: " + location.getLatitude() + " " + location.getLongitude());
}
};
};
Run Code Online (Sandbox Code Playgroud)
然后,分配mFusedLocationClient在onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
requestLocationUpdates();
//...............
}
Run Code Online (Sandbox Code Playgroud)
然后onResume(),如果设置了GoogleApiClient和FusedLocationProviderClient,则使用它们.否则,这是第一次启动Activity,所以连接GoogleApiClient:
@Override
public void onResume() {
if (mFusedLocationClient != null) {
requestLocationUpdates();
}
}
public void requestLocationUpdates() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000); // two minute interval
mLocationRequest.setFastestInterval(120000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
}
}
Run Code Online (Sandbox Code Playgroud)
最后,在onPause(),致电removeLocationUpdates():
@Override
public void onPause() {
super.onPause();
if (mFusedLocationClient != null) {
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17957 次 |
| 最近记录: |