6

Ho un'applicazione con TabActivity in cui sto visualizzando una finestra di dialogo ogni volta che ricevo una richiamata dal mio motore (codice C NDK). Mi assicuro che la finestra di dialogo venga visualizzata quando l'app è in stato di ripresa.Android: finestra di dialogo attività/finestra di dialogo scompare in modo imprevisto

Dopo aver ricevuto la richiamata dal motore, avvio l'attività NetworkDownDialog, ma in questo modo la finestra di dialogo rimane per un secondo e quindi scompare. La stessa cosa accade se uso Dialog o AlertDialog. Stranamente, la scomparsa sembra casuale (non sempre accade).

Questo è un dispositivo S3. Cosa sta succedendo?

Edit 23/05/2013

rete Giù Dialog Codice

public class NetworkDownDialog extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.network_down); 
     Logger.d("NetworkDownDialog", "----------onCreate-----------"); 
     registerReceiver(mNetworkDownReceiver, new IntentFilter("NetworkDown")); 
    } 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(mNetworkDownReceiver); 
     Logger.d("NetworkDownDialog", "------onDestroy-------"); 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     Logger.d("NetworkDownDialog", "------onResume-------"); 
    } 
    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Logger.d("NetworkDownDialog", "------onRestart-------"); 
    } 
    @Override 
    protected void onStart() { 
     super.onStart(); 
     Logger.d("NetworkDownDialog", "------onStart-------"); 
    } 
    @Override 
    protected void onStop() { 
     super.onStop(); 
     Logger.d("NetworkDownDialog", "------onStop-------"); 
    } 
    @Override 
    public void onBackPressed() { 
     Logger.d("NetworkDownDialog", "------onBackPressed Do nothing-------"); 
    } 
    private BroadcastReceiver mNetworkDownReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    }; 
} 

Nei registri, questo è quello che vedo:

05-15 20:48:02.981 D/NetworkDownDialog(1050): ------onCreate------- 
05-15 20:48:02.981 D/alsa_ucm( 202): Setting mixer control: RX5 MIX1 INP2, value: RX2 
05-15 20:48:02.991 D/alsa_ucm( 202): Setting mixer control: RX6 DSM MUX, value: DSM_INV 
05-15 20:48:02.991 D/alsa_ucm( 202): Setting mixer control: LINEOUT2 Volume, value: 100 
05-15 20:48:02.991 D/alsa_ucm( 202): Setting mixer control: LINEOUT4 Volume, value: 100 
05-15 20:48:02.991 D/NetworkDownDialog(1050): ------onStart------- 
05-15 20:48:02.991 D/alsa_ucm( 202): Setting mixer control: RX5 Digital Volume, value: 65 
05-15 20:48:02.991 D/NetworkDownDialog(1050): ------onResume------- 

Dialog Attività visualizzato

**05-15 20:48:05.073 W/InputDispatcher( 716): channel ~ Consumer closed input channel or an error occurred. events=0x9 
05-15 20:48:05.073 E/InputDispatcher( 716): channel ~ Channel is unrecoverably broken and will be disposed!** 
05-15 20:48:05.073 W/InputDispatcher( 716): Attempted to unregister already unregistered input channel 
05-15 20:48:05.083 I/SurfaceFlinger( 195): id=2033 Removed idx=5 MapSz=4 
05-15 20:48:05.083 D/KeyguardViewMediator( 716): setHidden false 
05-15 20:48:05.103 I/Adreno200-EGLSUB( 195): <CreateImage:897>: Android Image 
05-15 20:48:05.103 I/Adreno200-EGLSUB( 195): <GetImageAttributes:1106>: RGBA_8888 
**05-15 20:48:05.103 E/BufferQueue( 195): [mypackage.NetworkDownDialog] dequeueBuffer: SurfaceTexture has been abandoned! 
05-15 20:48:05.103 E/SurfaceTextureClient(1050): dequeueBuffer failed (No such device**) 
05-15 20:48:05.103 D/PhoneStatusBar( 894): addNotification score=0 
05-15 20:48:05.123 E/ViewRootImpl(1050): Could not lock surface 
05-15 20:48:05.123 E/ViewRootImpl(1050): java.lang.IllegalArgumentException 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Surface.lockCanvasNative(Native Method) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Surface.lockCanvas(Surface.java:88) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2314) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2277) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2145) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1956) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1110) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4472) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Choreographer.doFrame(Choreographer.java:525) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.os.Handler.handleCallback(Handler.java:615) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.os.Looper.loop(Looper.java:137) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at android.app.ActivityThread.main(ActivityThread.java:4918) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at java.lang.reflect.Method.invokeNative(Native Method) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at java.lang.reflect.Method.invoke(Method.java:511) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
05-15 20:48:05.123 E/ViewRootImpl(1050): at dalvik.system.NativeStart.main(Native Method) 

In questo caso, lo ActivityDialog è scomparso dopo quanto sopra.

Perché il mio dialogo scompare? È possibile che il danneggiamento della memoria nel mio codice nativo a livello C stia causando questo problema? Sto facendo qualcosa di sbagliato nell'interfaccia utente? Sono totalmente bloccato ...

Modifica il 24 -05 -2013

05-24 19:49:00.025 I/SurfaceFlinger(1901): id=2147 Removed NainTabActivity idx=3 MapSz=4 

05-24 19:49:00.025 I/SurfaceFlinger(1901): id=2147 Removed NainTabActivity idx=-2 MapSz=4 

SurfaceFlinger rimosso il mio tabactivity.Will questo può causare dialogo rimuovere?

+0

sei sicuro, non stai chiamando la finestra di dialogo Annulla in questo processo? – Meher

+0

No, non sto chiamando Annulla. – NitZRobotKoder

+0

Quali sono le opzioni di accelerazione hardware impostate? – ozbek

risposta

0

Ben bene il problema era con il codice c qualche file descrittore fd corrotto stava causando questo problema.anche il problema è stato risolto a livello c il problema non è visto.piccolo strano però.

5
  1. Assicurarsi di visualizzare la finestra di dialogo con il contesto dell'applicazione.
  2. Assicurati che non arrivino due eventi e colpisci la stessa parte di code.i.e quando stai per visualizzare la finestra di dialogo, un altro evento dal codice c per visualizzare la finestra di dialogo.
  3. Assicurarsi che l'applicazione disponga di memoria sufficiente per funzionare senza intoppi.
+0

1) L'attività è iniziata con TabActivity Context.2) è curata.3) Giusto, ma è la più dura parte da sapere. – NitZRobotKoder

+1

Non sembra un problema di memoria esaurita, da [ViewRootImpl.java] (https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewRootImpl.java) : 'Log.e (TAG," Could not lock surface ", e);' _Non supponiamo che ciò sia dovuto a memoria insufficiente, potrebbe essere qualcos'altro, e se è qualcos'altro allora potremmo uccidere roba (o noi stessi) senza motivo._ – ozbek

+0

@NitZRobotKoder hai usato la finestra di dialogo personalizzata? puoi pubblicare il tuo codice di dialogo? – TheFlash

3

L'errore che si ottiene è dovuto al fatto che lo schermo non è pronto per visualizzare nulla nel momento in cui si chiama lo dialog.show().

Altro (possibile) soluzione per voi è quella di utilizzare un sistema di dialogo come in questo esempio:

AlertDialog dialog = new AlertDialog.Builder(context) 
    .setMessage(text) 
    .setPositiveButton(R.string.ok, null) 
    .setCancelable(true) 
    .create(); 
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
+0

Ci assicuriamo che l'attività sia in ripresa prima di mostrare la finestra di dialogo. – NitZRobotKoder

1

Quando ho visto (canale ~ Consumer chiuso il canale di ingresso) prima seguita da un errore che ho trovato per indicare che l'applicazione è stata chiudendo o da disegno o un eccezione sollevata altrove. La mia impressione sarebbe che tu stia terminando la tua attività o riscontrando un'eccezione nello stesso momento in cui la finestra di dialogo viene visualizzata causando l'avvio della tua app. Aggiungo anche più Logging in qualsiasi posto tu chiami finish per verificare che non stai finendo per caso mentre visualizzi la finestra di dialogo.

+0

La chiamata di fine viene gestita bene! – NitZRobotKoder

2

Dopo aver visto il tuo codice, ti consiglio di rimuovere finish() nel tuo BroadcastReceiver ed eseguire il tuo programma (a scopo di test). Il problema che si sta verificando potrebbe verificarsi a causa del fatto che il tuo Activity inizia e termina quasi contemporaneamente.

+0

La chiamata di fine viene gestita bene! – NitZRobotKoder

Problemi correlati