在请求时获取错误位置位置奥利奥中 JobInetentService 中的更新



我写了一个基于 GPS 的位置服务,我在其中调用requestLocationUpdates以获取更新的位置及其正常工作,但是当我瞄准Android Oreo时,我用JobIntentService替换了Service。但是当我运行应用程序时,会出现以下错误。请提供解决方案。

java.lang.RuntimeException: An error occurred while executing doInBackground()                                                                              at android.os.AsyncTask$3.done(AsyncTask.java:361)
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
     at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
     at java.util.concurrent.FutureTask.run(FutureTask.java:271)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
     at java.lang.Thread.run(Thread.java:764)
  Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
     at android.os.Handler.<init>(Handler.java:204)
     at android.os.Handler.<init>(Handler.java:118)
     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:234)
     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:234)
     at android.location.LocationManager.wrapListener(LocationManager.java:872)
     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:885)
     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:470)
     at com.example.services.LocationService.onHandleWork(LocationService.java:49)
     at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:391)
     at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382)
     at android.os.AsyncTask$2.call(AsyncTask.java:333)
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
     at java.lang.Thread.run(Thread.java:764) 

我的班级

public class LocationService extends JobIntentService {
LocationManager MylocationManager;
LocationListenerClass MylocationListener;
Context context;
Location mLocation;
@Override
public void onCreate() {
super.onCreate();
context = this;
}
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, LocationService.class, Constants.JOB_ID, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
} else {
MylocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
MylocationListener = new LocationListenerClass();
MylocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 36000000, 5000, MylocationListener);
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
public class LocationListenerClass implements LocationListener {
@Override
public void onLocationChanged(Location location) {
if (location == null) {
return;
}
mLocation = location;
try {
if (MylocationManager != null) {
MylocationManager.removeUpdates(MylocationListener);
MylocationManager = null;
}
} catch (Exception e) {
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
if (MylocationManager != null) {
MylocationManager.removeUpdates(MylocationListener);
MylocationManager = null;
}

}
}
}

我正在通过以下代码启动服务

Intent intent1 = new Intent(context, LocationService.class);
LocationService.enqueueWork(context, intent1);

问题是LocationManager的实现正在创建一个处理程序。 处理程序只能在名为 Looper.loop(( 的线程上创建。 例如,UI 线程(框架调用它的位置(或 HandlerThread(用于使用 Loopers(。 IntentService在自己的线程上运行,没有Looper。 您需要调用另一个线程上的请求位置更新,您创建的处理程序线程或 UI 线程将是最容易的。

最新更新