Android Maintask 中 运行 方法中的异常
Android Exception in run Method in a Maintask
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我得到一个服务,每 15 秒调用我的 MainTask
的 run
方法(出于测试原因)timer.scheduleAtFixedRate(new MainTask(), 0, 15000);
(在 onStartCommand
中调用。
运行 方法中的代码如下所示:
public void run() {
Log.v("MainTask", "run() Called");
GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error
// Doing some independent webrequests here!
}
GpsHelper class 看起来像这样(它有一些 if 语句 - 因为它也在 Mainactivity
中的服务之外使用:
public GpsHelper(Context context, LocationReceiver locationReceiver) {
this.context = context;
this.locationReceiver = locationReceiver;
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationReceiver instanceof Runnable) {
isRunnable = true;
}
run();
}
/**
* Getting the Location, handling permission, requesting location updates if time is greater than 2 minutes
*/
public void getLocation() {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && !isRunnable) {
StaticHelpers.askForFineLocationPermission(context);
} else {
if (isRunnable && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.v("GpsHelper", "Runnable can't get position - check permissions!");
} else {
Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
// If time not greater than 2 minutes
// TODO: Move to resources
if (location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000) {
Log.v("GpsHelper", "Using existing location");
locationReceiver.onLocationAvailable(location);
} else {
Log.v("GpsHelper", "No Position Available => Requesting Location Updates");
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
if (!isRunnable && !mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
showSettingsDialog();
}
}
}
}
获取位置后调用此方法:
mLocationManager.removeUpdates(this);
这个错误是什么时候出现的?
第四次运行被调用
可能的答案需要包含什么?
一个答案应该可以帮助我在不改变任何逻辑行为的情况下修复这个错误,并且 不应该 运行 在 ui 线程 !
上
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Log.v("MainTask", "run() Called");
GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error
}
});
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我得到一个服务,每 15 秒调用我的 MainTask
的 run
方法(出于测试原因)timer.scheduleAtFixedRate(new MainTask(), 0, 15000);
(在 onStartCommand
中调用。
运行 方法中的代码如下所示:
public void run() {
Log.v("MainTask", "run() Called");
GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error
// Doing some independent webrequests here!
}
GpsHelper class 看起来像这样(它有一些 if 语句 - 因为它也在 Mainactivity
中的服务之外使用:
public GpsHelper(Context context, LocationReceiver locationReceiver) {
this.context = context;
this.locationReceiver = locationReceiver;
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationReceiver instanceof Runnable) {
isRunnable = true;
}
run();
}
/**
* Getting the Location, handling permission, requesting location updates if time is greater than 2 minutes
*/
public void getLocation() {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && !isRunnable) {
StaticHelpers.askForFineLocationPermission(context);
} else {
if (isRunnable && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.v("GpsHelper", "Runnable can't get position - check permissions!");
} else {
Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
// If time not greater than 2 minutes
// TODO: Move to resources
if (location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000) {
Log.v("GpsHelper", "Using existing location");
locationReceiver.onLocationAvailable(location);
} else {
Log.v("GpsHelper", "No Position Available => Requesting Location Updates");
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
if (!isRunnable && !mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
showSettingsDialog();
}
}
}
}
获取位置后调用此方法:
mLocationManager.removeUpdates(this);
这个错误是什么时候出现的? 第四次运行被调用
可能的答案需要包含什么? 一个答案应该可以帮助我在不改变任何逻辑行为的情况下修复这个错误,并且 不应该 运行 在 ui 线程 !
上getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Log.v("MainTask", "run() Called");
GpsHelper gpsHelper = new GpsHelper(getApplicationContext(), this); // This is causing the error - commented out => no error
}
});