Android: как использовать Handlemessage обработчика и получить доступ к ссылке на MainActivity

У меня есть служба, которая получает команду из интернета и запускает фоновый поток. Этот поток передается обработчиком из службы (служба ограничена и передана обработчику) и отправляет сообщение обработчику, чтобы сделать снимок. Я застрял на реализации обработчика.

static Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            //TODO: Handle different types of messages
            mCamera.takePicture(null, null, MainActivity.this);
        }
};

вопросы:

  • должен ли обработчик быть статическим? Без статики я получаю " этот класс обработчика должен быть статическим или утечки могут происходят"
  • должен ли mCamera быть статичным? Мне сказали сделать mcamera статической, но почему это необходимо? Есть ли способ настроить takePicture без статики mCamera?
  • Как правильно передать ссылку на MainActivity? Прямо сейчас я получаю ошибку: "нет заключительного экземпляра типа MainActivity доступен в области"

4 ответов


вы можете сделать реализацию класса (Activity/Service)Handler.Callback и создайте для него новый обработчик через new Handler(this).


вы можете изменить ваш код следующим образом:

    static Handler handler = new Handler() {

            MainActivity mActivity;

            @Override
            public void handleMessage(Message msg) {
                //TODO: Handle different types of messages
                if(mActivity != null) {
                    mActivity.mCamera.takePicture(null, null, mActivity);
                }
            }
    };

    void MainActivity::onCreate(Bundle savedState) {
         ...
         handler.mActivity = this;
    }

    void MainActivity::onDestroy() {
        ...
        handler.mActivity = null;
    }     

вот хорошее объяснение, почему обработчик должен быть статическим:

этот класс обработчика должен быть статическим или могут произойти утечки: IncomingHandler

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


можно использовать и передайте нужный объект обработчику.

static Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            //TODO: Handle different types of messages
            //TODO: handle cast exception
            final MainActivity activity = (MainActivity) msg.obj;
            final Camera camera = activity.getCamera();
            camera.takePicture(null, null, activity);
        }
};