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