gpt4 book ai didi

java - Binder 线程上的 GPS 警告消息

转载 作者:行者123 更新时间:2023-12-01 13:43:39 25 4
gpt4 key购买 nike

我正在与 UI 线程不同的线程上从主 Activity 运行 Gps 定位元素:

public class MyActivity extends Activity {
...
public Handler gpshandler = null;
public void onCreate(Bundle savedInstanceState) {
...
Thread gpsThread = new Thread(new Runnable() {
public void run() {
Looper.prepare();
gpshandler = new Handler();
gps = new GPSClass(MyActivity.this);
Looper.loop();
}
}, "GPSThread");
gpsThread.start();
}
...
@Override
protected void onDestroy() {
super.onDestroy();
gps.onPause();
gpshandler.getLooper().quit();
}

我的GPS类如下:

public class GPSClass implements LocationListener, GpsStatus.Listener{
private double latitute, longitude;
private LocationManager locationManager;
private String provider;
private GpsStatus status;
private boolean hasGPSFix = false;
private Location lastLoc;
private long lastLocTime;
private boolean started = false;

public GPSClass(Context context) {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
locationManager.addGpsStatusListener(this);

start();
started = true;
}

private void start() {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setCostAllowed(false);
criteria.setSpeedRequired(false);
criteria.setAltitudeRequired(false);

if(hasGPSFix || !started) {
provider = locationManager.getBestProvider(criteria, true);
} else {
provider = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) ?
LocationManager.NETWORK_PROVIDER : locationManager.getBestProvider(criteria, true);
}

if(provider != null){
Location location = locationManager.getLastKnownLocation(provider);

if (location != null) {
onLocationChanged(location);
} else {
latitute = 0.0;
longitude = 0.0;
}
}
computeLocation();
}

public void computeLocation(){
locationManager.requestLocationUpdates(provider, 20000, 100, this);
}

public void onPause(){
locationManager.removeUpdates(this);
}


@Override
public void onLocationChanged(Location location) {
if (location == null) return;

lastLocTime = SystemClock.elapsedRealtime();

latitute = location.getLatitude();
longitude = location.getLongitude();

lastLoc = location;
}

@Override
public void onProviderDisabled(String provider) {
start();
}

@Override
public void onProviderEnabled(String provider) {
start();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) { // not a good method, there are some issues with it not being called, don't rely on it!
if(status != LocationProvider.TEMPORARILY_UNAVAILABLE){
start();
}
}

public double getLatitute() {
return latitute;
}

public double getLongitude() {
return longitude;
}

public String getProvider() {
return provider;
}

@Override
public void onGpsStatusChanged(int event) {
status = locationManager.getGpsStatus(status);
switch (event) {
case GpsStatus.GPS_EVENT_STARTED:
// Do Something
break;
case GpsStatus.GPS_EVENT_STOPPED:
// Do Something
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
hasGPSFix = true;
// Do Something
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
if (lastLoc != null)
hasGPSFix = (SystemClock.elapsedRealtime() - lastLocTime) < 10000;

if (hasGPSFix) {

// Do something.
} else {
start();
}

// Do Something
break;
}
}
}

我使用 gpshandler 执行 Looper.quit() 方法并使用 gps 对象的 get 方法获取位置。

这个方法效果很好,我能够得到我想要的信息。但是,我有时(一半的时间)收到以下警告消息:

Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {41ada040} sending message to a Handler on a dead thread
java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {41ada040} sending message to a Handler on a dead thread
at android.os.Handler.sendMessageAtTime(Handler.java:473)
at android.os.Handler.sendMessageDelayed(Handler.java:446)
at android.os.Handler.sendMessage(Handler.java:383)
at android.location.LocationManager$GpsStatusListenerTransport.onGpsStopped(LocationManager.java:1382)
at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:57)
at dalvik.system.NativeStart.run(Native Method)

Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {41ada040} sending message to a Handler on a dead thread
java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {41ada040} sending message to a Handler on a dead thread
at android.os.Handler.sendMessageAtTime(Handler.java:473)
at android.os.Handler.sendMessageDelayed(Handler.java:446)
at android.os.Handler.sendMessage(Handler.java:383)
at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1382)
at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:57)
at dalvik.system.NativeStart.run(Native Method)

这些警告不会影响该过程,但我想了解发生了什么......使用 DDMS,我发现这些警告发生在 Binder 线程上。有谁知道为什么会发生这种情况以及为什么它不会一直发生?谢谢

编辑

我深入研究了一下,发现当它们发生时,它们可以发生在所有 Binder 上,但它们一次只影响其中的两个。我对Binders不熟悉,但是莫非有状态广播?我不知道如何知道绑定(bind)程序附加到哪些线程,并且我尝试过调试,但由于某种原因,我无法在 Debug模式下重现警告。但是,我在 onGpsStatusChanged 方法中设置了一个调试日志,该日志报告收到的 GPS 状态。这是 logcat 的输出。我刚刚对其进行了编辑,以显示消息发生在哪些线程上。

12-12 09:32:18.133: W/MessageQueue(Binder_3): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:18.133: W/MessageQueue(Binder_3): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:18.133: W/MessageQueue(Binder_3): at dalvik.system.NativeStart.run(Native Method)
12-12 09:32:18.133: D/gps(GPSThread): got status 4
12-12 09:32:18.133: W/MessageQueue(Binder_1): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:18.133: W/MessageQueue(Binder_1): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:18.133: W/MessageQueue(Binder_1): at dalvik.system.NativeStart.run(Native Method)

12-12 09:32:19.128: W/MessageQueue(Binder_1): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:19.128: W/MessageQueue(Binder_1): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:19.128: W/MessageQueue(Binder_1): at dalvik.system.NativeStart.run(Native Method)
12-12 09:32:19.128: D/gps(GPSThread): got status 4
12-12 09:32:19.128: W/MessageQueue(Binder_5): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:19.128: W/MessageQueue(Binder_5): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:19.128: W/MessageQueue(Binder_5): at dalvik.system.NativeStart.run(Native Method)

12-12 09:32:20.123: W/MessageQueue(Binder_3): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:20.123: W/MessageQueue(Binder_3): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:20.123: W/MessageQueue(Binder_3): at dalvik.system.NativeStart.run(Native Method)
12-12 09:32:20.123: D/gps(GPSThread): got status 4
12-12 09:32:20.123: W/MessageQueue(Binder_4): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:20.123: W/MessageQueue(Binder_4): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:20.123: W/MessageQueue(Binder_4): at android.os.Binder.execTransact(Binder.java:367)

12-12 09:32:21.173: D/gps(GPSThread): got status 4
12-12 09:32:21.173: W/MessageQueue(Binder_2): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:21.173: W/MessageQueue(Binder_2): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:21.173: W/MessageQueue(Binder_2): at dalvik.system.NativeStart.run(Native Method)
12-12 09:32:21.178: W/MessageQueue(Binder_3): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:21.178: W/MessageQueue(Binder_3): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:21.178: W/MessageQueue(Binder_3): at dalvik.system.NativeStart.run(Native Method)

12-12 09:32:22.108: D/gps(GPSThread): got status 4
12-12 09:32:22.113: W/MessageQueue(Binder_5): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:22.113: W/MessageQueue(Binder_5): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {425536f8} sending message to a Handler on a dead thread
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:22.113: W/MessageQueue(Binder_5): at dalvik.system.NativeStart.run(Native Method)
12-12 09:32:22.113: W/MessageQueue(Binder_3): Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:22.113: W/MessageQueue(Binder_3): java.lang.RuntimeException: Handler (android.location.LocationManager$GpsStatusListenerTransport$1) {42602058} sending message to a Handler on a dead thread
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.os.Handler.sendMessage(Handler.java:383)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.location.LocationManager$GpsStatusListenerTransport.onSvStatusChanged(LocationManager.java:1406)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.location.IGpsStatusListener$Stub.onTransact(IGpsStatusListener.java:89)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at android.os.Binder.execTransact(Binder.java:367)
12-12 09:32:22.113: W/MessageQueue(Binder_3): at dalvik.system.NativeStart.run(Native Method)

最佳答案

我不完全明白到底发生了什么,但我有一个模糊的想法...我在完成 Looper.loop() 之前和完全初始化我的程序之前添加了 GPS 监听器GPS类。因此,我猜测有时 LocationManager 使用的 LocationProvider 会崩溃,因为我的监听器类尚未完成初始化或因为循环程序尚未启动。

但是,仍然添加了监听器,这可以解释为什么我仍然收到更新。我仍然不明白为什么我在不同的 Binders 上收到警告......我找到的解决方案是将 Gps 监听器添加到由我的 Activity 的 onResume() 触发的方法中的 LocationManager,而不是在 onCreate 中,当 GPSClass 执行 onPause() 时执行 .removeGpsStatusListener()

非常感谢 zapl 的意见;)

关于java - Binder 线程上的 GPS 警告消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20499710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com