2015-10-20 11 views
5

Ich versuche, meine App, die perfekt auf API-Geräten funktioniert, auf einem API 23-Gerät arbeiten.
Wenn der Benutzer eine Einstellung über das Optionsmenü ändert, wird die Aktivität im Grunde mit recreate() neu erstellt. Wenn ich jetzt langsam auf die Menüoption tippe (damit ich Zeit habe, die Option hervorgehoben zu sehen), ist alles in Ordnung, aber wenn ich kurz tippe, stürzt die App ab.
Ich weiß, es ist ein merkwürdiges Verhalten und ich hatte schwere Zeit zu verstehen, was den Fehler auslöst. Ich legte eine Auszeit vor recover(), also ist die Option möglicherweise "validiert", aber das hat nicht funktioniert. Ich kann nur an eine Art von Fehler in API 23 denken, weil es zuvor mit anderen APIs gearbeitet hat. Hier ist ein Ausschnitt aus meinem Code (nichts Besonderes):Fehler bei recreate() innerhalb onOptionsItemSelected() in API 23/Marshmallow

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

und die logcat:

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) 

Jede Hilfe oder Ratschläge wäre sehr geschätzt.

UPDATE: Ich denke definitiv, dass es einen Fehler in API> 23 gibt. ein neues Projekt mit einer leeren Aktivität und nur hinzufügen, die in onOptionsItemSelected()

if (id == R.id.action_settings) { 
    recreate(); 
    return true; 
} 

die App noch nach dem Erstellen abstürzt.

Also meine Abhilfe ist:

Intent intent = getIntent(); 
    finish(); 
    startActivity(intent); 

Aber das Nachladen ist nicht so glatt wie mit recreate() (ich ein wenig Blinken sehen).

+1

"Ich habe eine Fehlermeldung" - bitte buchen Sie die Java-Stack-Trace oder andere Fehlermeldung. – CommonsWare

+0

Ich immer noch nicht, was ist das Problem, indem Protokolle zu sehen, aber Recraete() kann mit InvalidateOptionsMenu() ersetzt werden – dex

+0

Ich habe bereits versucht, invalidateOptionsMenu(), aber es tut nicht den Trick der Neuerstellung/Aktualisierung der Seite. Ich benutze es für erfrischende Menüoptionen und es funktioniert gut für diesen Zweck. – Vega

Antwort