Получение ошибки в методе create() внутри onOptionsItemSelected() в API 23 / Marshmallow
Я пытаюсь сделать свое приложение, которое отлично работает на устройствах с интерфейсом API<23, для работы на устройстве с интерфейсом API 23. Это сбой в следующем сенарио. Пользователь меняет настройки через options menu
, Если они медленно нажимают на опцию меню (так что есть время, чтобы увидеть выделенную опцию), все в порядке, но если они кратко нажимают, приложение вылетает.
Я знаю, что это довольно странное поведение, и я потратил некоторое время, пытаясь понять, что вызывает ошибку. Ошибка возникает после того, как метод create() находится в onOptionItemSelected
, Я поставил тайм-аут, прежде чем restate (), чтобы проверить, является ли параметр "проверенным", но это не сработало. Я могу думать только о какой-то ошибке в API 23, потому что раньше она работала с другими API. Вот фрагмент моего кода (сокращен до минимума):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_1:
//... some code goes here
recreate();
return true;
// some other options ..
}
return super.onOptionsItemSelected(item);
}
После создания нового проекта с пустым действием и просто добавления внутри onOptionsItemSelected()
if (id == R.id.action_settings) {
recreate();
return true;
}
приложение все еще падает.
Вот логкат:
10-20 23:12:10.062 3217-3245/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab3d1b80 10-20 23:12:11.050 3217-3245/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb4013030 10-20 23:12:11.075 3217-3245/? E/Surface: queueBuffer: error queuing buffer to SurfaceTexture, -19 10-20 23:12:11.075 3217-3245/? E/EGL_emulation: tid 3245: swapBuffers(324): error 0x3003 (EGL_BAD_ALLOC) 10-20 23:12:11.075 3217-3245/? A/OpenGLRenderer: Encountered EGL error 12291 EGL_BAD_ALLOC during rendering 10-20 23:12:11.075 3217-3245/? A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 3245 (RenderThread)
1 ответ
Это действительно было ошибкой. После того, как я сообщил, это было исправлено Google. За ним можно следить здесь: https://code.google.com/p/android/issues/detail?id=195966
Тем временем мой обходной путь должен заменить recreate()
от:
Intent intent = getIntent();
finish();
startActivity(intent);
Но перезагрузка не так гладкая, как с refreshate() (я вижу, немного мигает).