Binder线程上的Gps警告消息

时间:2013-12-10 16:22:36

标签: java android multithreading gps

我在主要Activity上运行Gps定位元素,该线程与UI线程不同:

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();
}

我的GPSClass如下:

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线程上。有谁知道为什么会这样,以及为什么它不会一直发生?感谢

修改

我挖了一下,我发现当它们发生时,它们可以出现在所有的粘合剂上,但它们一次只影响其中两个。我对Binders不熟悉,但可能是有广播状态吗?我不知道如何知道Binders附加哪些线程并且我已经尝试过调试,但由于某种原因,我无法在调试模式下重现警告。但是,我在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)

1 个答案:

答案 0 :(得分:1)

我并不完全了解真正发生的事情,但我有一个含糊的想法......我在完成Looper.loop()之前和完全初始化GPSClass之前添加了GPS监听器。 因此,我猜测有时LocationProvider使用的LocationManager崩溃了,因为我的监听器类还没有完成初始化或因为looper没有启动。

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

非常感谢zapl的输入;)