Получение ошибки в методе 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() (я вижу, немного мигает).

Другие вопросы по тегам