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 static?
  • Каков правильный способ передачи ссылки на MainActivity? Прямо сейчас я получаю сообщение об ошибке: «Нет экземпляра экземпляра типа MainActivity доступен в области видимости»

Solutions Collecting From Web of "Android: как использовать обработчик handleMessage и получить доступ к ссылке на MainActivity"

Вы можете заставить класс (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

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

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

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