android - 在服务中获取位置时向死线程上的处理程序发送消息

标签 android android-asynctask wear-os

我开发了 Android Wear 表盘,它在手持端的服务中获取位置。我使用从这里获得的 AsyncTask 代码。 此错误会耗尽手机约 50% 的电量。我不知道为什么。请帮忙。 错误:

W/MessageQueue: Handler (android.location.LocationManager$ListenerTransport$1) {93795ca} sending message to a Handler on a dead thread
                                                                 java.lang.IllegalStateException: Handler (android.location.LocationManager$ListenerTransport$1) {93795ca} sending message to a Handler on a dead thread
                                                                     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
                                                                     at android.os.Handler.enqueueMessage(Handler.java:631)
                                                                     at android.os.Handler.sendMessageAtTime(Handler.java:600)
                                                                     at android.os.Handler.sendMessageDelayed(Handler.java:570)
                                                                     at android.os.Handler.sendMessage(Handler.java:507)
                                                                     at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:248)
                                                                     at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58)
                                                                     at android.os.Binder.execTransact(Binder.java:453)

我的服务:

public class WeatherService extends WearableListenerService {

private void startTask() {

        Log.d(TAG, "Start Weather AsyncTask");
        mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Wearable.API).build();

        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = mLocationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = mLocationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (!isGPSEnabled && !isNetworkEnabled) {
            Log.d(TAG, "no network provider is enabled");
            // no network provider is enabled

        } else {
            this.canGetLocation = true;
            Log.d(TAG, "canGetLocation" + isGPSEnabled + isNetworkEnabled);
            if (isNetworkEnabled) {
                mLocationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        0,
                        0, new LocationListener() {
                            @Override
                            public void onLocationChanged(Location location) {
                                Log.d(TAG, "onLocationChanged: " + location);
                                //mLocation = location;
                                mLocationNetwork = location;
                                Task task = new Task();
                                task.execute();
                                Log.v(TAG, "isNetworkEnabled onLocationChanged: " + mLocationNetwork);
                                if (mLocationManager != null) {
                                    mLocationManager.removeUpdates(this);
                                }
                            }

                            @Override
                            public void onStatusChanged(String provider, int status, Bundle extras) {
                                Log.d(TAG, "onLocationChanged: " + location);
                                if (mLocationManager != null) {
                                    mLocationManager.removeUpdates(this);
                                }
                                //mLocation = location;
                                mLocationNetwork = location;

                            }

                            @Override
                            public void onProviderEnabled(String provider) {
                                if (mLocationManager != null) {
                                    mLocationManager.removeUpdates(this);
                                }

                            }

                            @Override
                            public void onProviderDisabled(String provider) {
                                if (mLocationManager != null) {
                                    mLocationManager.removeUpdates(this);
                                }
                            }

                        });
                Log.d("Network", "Network Enabled");
                if (mLocationManager != null) {
                    location = mLocationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                        Log.d(TAG, "Network Enabled: lat and long: " + latitude + longitude);
                        Task task = new Task();
                        task.execute();
                        Log.v(TAG, "isNetworkEnabled mLocationManager != null: " + location + latitude + longitude);


                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    mLocationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            0,
                            0, new LocationListener(){
                                @Override
                                public void onLocationChanged( Location location )
                                {
                                    Log.d( TAG, "onLocationChanged: " + location );

                                    //mLocation = location;
                                    mLocationNetwork = location;
                                    Task task = new Task();
                                    task.execute();
                                    Log.v(TAG, "isGPSEnabled onLocationChanged: " + mLocationNetwork);
                                    if (mLocationManager != null) {
                                        mLocationManager.removeUpdates(this);
                                    }
                                }

                                @Override
                                public void onStatusChanged( String provider, int status, Bundle extras )
                                {
                                    Log.d( TAG, "onLocationChanged: " + location );
                                    //mLocation = location;
                                    mLocationNetwork = location;
                                    if (mLocationManager != null) {
                                        mLocationManager.removeUpdates(this);
                                    }
                                }

                                @Override
                                public void onProviderEnabled( String provider )
                                {
                                    if (mLocationManager != null) {
                                        mLocationManager.removeUpdates(this);
                                    }
                                }

                                @Override
                                public void onProviderDisabled( String provider )
                                {
                                    if (mLocationManager != null) {
                                        mLocationManager.removeUpdates(this);
                                    }
                                }
                            });
                    Log.d("GPS", "GPS Enabled");
                    if (mLocationManager != null) {
                        location = mLocationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            Log.d(TAG, "GPS Enabled: lat and long: " + latitude + longitude);
                            Task task = new Task();
                            task.execute();
                            Log.v(TAG, "isGPSEnabled mLocationManager != null: " + location + latitude + longitude);
                        }
                    }
                }
            }
        }

    }

这是 ASyncTask:

private class Task extends AsyncTask
    {
        private String resp;
        @Inject
        IWeatherApi api;

        @Override
        protected Object doInBackground( Object[] params )
        {
            if (this.isCancelled()) {
                return null;
            }
            try
            {
                Log.d( TAG, "Task Running" );
                RoboGuice.getInjector( WeatherService.this.getApplicationContext() ).injectMembers( this );

                if ( !mGoogleApiClient.isConnected() )
                { mGoogleApiClient.connect();

                }

                final DataMap config = new DataMap();

                WeatherInfo infoNetwork = api.getCurrentWeatherInfo(latitude, longitude);

                config.putInt( KEY_WEATHER_TEMPERATURE, infoNetwork.getTemperature() );
                config.putString( KEY_WEATHER_CONDITION, infoNetwork.getCondition() );
                config.putLong( KEY_WEATHER_SUNSET, infoNetwork.getSunset() );
                config.putLong( KEY_WEATHER_SUNRISE, infoNetwork.getSunrise() );
                config.putInt( KEY_WEATHER_WIND_SPEED, infoNetwork.getSpeed() );
                config.putInt( KEY_WEATHER_WIND_DEGREE, infoNetwork.getDeg() );
                config.putInt( KEY_WEATHER_TEMP_MIN, infoNetwork.getTempMin() );
                config.putInt( KEY_WEATHER_TEMP_MAX, infoNetwork.getTempMax() );
                config.putInt( KEY_WEATHER_HUMIDITY, infoNetwork.getHumidity() );
                config.putInt( KEY_WEATHER_PRESSURE, infoNetwork.getPressure() );

                    Wearable.MessageApi.sendMessage(mGoogleApiClient, mPeerId, PATH_WEATHER_INFO, config.toByteArray())
                            .setResultCallback(
                                    new ResultCallback<MessageApi.SendMessageResult>() {
                                        @Override
                                        public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                                            Log.d(TAG, "SendUpdateMessage: " + sendMessageResult.getStatus());
                                            Log.v(TAG, KEY_WEATHER_CONDITION);
                                            Log.v(TAG, "AsyncTask config in onResult: " + config.toString());
                                            Log.v(TAG, "mGoogleApiClient, mPeerId, PATH_WEATHER_INFO, config.toByteArray()" + mGoogleApiClient + " " + mPeerId + " " + PATH_WEATHER_INFO + " " + config);
                                        }
                                    }
                            );

            }catch (IllegalStateException e) {
                e.printStackTrace();
                resp = e.getMessage();
            }
            catch ( Exception e )
            {
                Log.d( TAG, "Task Fail: " + e );
            }
            return null;
        }
    }

请帮忙,我是一名新开发人员,正在尝试解决这个问题,但目前没有任何结果。

最佳答案

您的错误 Handler on a dead thread 可能来自服务,该服务在完成后立即死亡。您可以使用 IntentService在调用 onHandleIntent 方法时创建一个新线程,然后在 onHandleIntent 方法返回时立即终止线程。

尝试在其他地方创建您的监听器,IntentService 对于设置监听器是不安全的,因为它们会死掉。它主要用于执行 main thread 之外的短任务。 .

这是一个可以帮助您解决问题的相关 SO 票证:Sending message to a Handler on a dead thread when getting a location from an IntentService

关于android - 在服务中获取位置时向死线程上的处理程序发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39045603/

相关文章:

android - 如何从 Android 模拟器对 Kik 的服务器 API 进行逆向工程?

java - 在 ANDROID 中后台运行时出现 java.lang.RunTimeException

java - 圆形和方形显示器检测 - Android Wear 服务

android - MediaExtractor.advance() - 比预期更早发出流结束信号

android - 后台服务需要在服务器上发送 GPS 位置

java - 将 Locale[] 转换为 CharSequence[] 以放置在 Android 应用程序中的 ListPreference 中

android - AsyncTask.doInBackground 在 2.3 上没有被调用,在 4.0+ 上工作

android - 如何将数据从 onSuccess 传递到其他类?

android - 通过 Android Studio 将大型应用程序传输到 Android Wear

android - CapabilityClient 返回 null