Как отловить ошибку bindService - PullRequest
0 голосов
/ 03 июля 2018

У меня есть некоторый предлог IntentService, который можно запустить или остановить. Мне нужно отразить его прогресс (текущее состояние, которое является довольно сложным) на Деятельности, если он виден.

Я не нашел надежного и хорошего способа выяснить, работает ли мой IntentService и готов ли он быть связанным с моей деятельностью.

Если я делаю bindService , он всегда возвращает true. Если IntentService не запущен, onServiceConnected (как и любые другие обратные вызовы) никогда не вызывается, и моя активность всегда остается в состоянии подготовки.

Единственным рабочим решением, которое я нашел, была статическая переменная в моем классе IntentService, которая указывает, что служба работает. Но я считаю, что использование такого подхода - плохая практика, и многие люди предупреждают, что в некоторых случаях он не может работать или быть непредсказуемым.

ВОПРОС: Как разработчики Android ожидают обработки сбоя вызова bindService?

И особый случай: что делать в случае, если мы пытаемся привязать сервис, который сейчас не работает, или в каком-то промежуточном состоянии (например, закрытие и т. Д.).

1 Ответ

0 голосов
/ 03 июля 2018
    private UploadService.Binder mServiceBinder;

    @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            createService();
        }

    private void createService() {
            if (mServiceBinder == null)
                bindService(new Intent(this, UploadService.class),
                        mConnection,
                        Context.BIND_AUTO_CREATE);
        }

private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mServiceBinder = ((UploadService.Binder) service);
            ((UploadService.Binder) service).getService().setCallback(DashFragment.getInstance());
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mServiceBinder = null;
        }
    };
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (mServiceBinder != null) {
                unbindService(mConnection);
                mServiceBinder = null;
            }
        }

Если mServiceBinder не равен NULL, значит, ваш сервис успешно привязан к активности, иначе вам нужно вызвать метод create service.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...