6

Mam aplikację z TabActivity, w której wyświetlaję okno dialogowe za każdym razem, gdy otrzymuję wywołanie zwrotne z mojego silnika (kod NDK C). Upewniam się, że okno dialogowe jest wyświetlane, gdy aplikacja jest w stanie wznowienia.Android: Okno dialogowe/okno dialogowe operacji niespodziewanie znika

Po odebraniu wywołania zwrotnego z silnika, rozpoczyna się działanie NetworkDownDialog, ale powoduje to, że okno dialogowe pozostaje na sekundę, a następnie znika. To samo dzieje się, gdy używam Dialog lub AlertDialog. Co najdziwniejsze, zniknięcie wydaje się przypadkowe (nie zawsze się zdarza).

To jest urządzenie S3. Co się dzieje?

Edycja na 23/05/2013

Dialog Downa Network Code

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

w dziennikach, to co widzę:

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 aktywny wyświetlany

**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) 

W tym przypadku ActivityDialog zniknął po powyższym.

Dlaczego moje okno dialogowe znika? Czy to możliwe, że uszkodzenie pamięci w natywnym kodzie mojego kodu C powoduje ten problem? Czy robię coś złego po stronie interfejsu użytkownika? Jestem całkowicie zatrzymany ...

Edycja na 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 zdjąłem tabactivity.Will może to spowodować usuń dialogowe?

+0

jesteś pewien, że nie wywołujesz w tym oknie dialogowym anulowania? – Meher

+0

Nie, nie dzwonię Anuluj. – NitZRobotKoder

+0

Jakie są opcje przyspieszenia sprzętowego? – ozbek

Odpowiedz

0

No cóż, problem polegał na tym, że jakiś kod fx został uszkodzony przez deskryptor pliku. Problem został rozwiązany na poziomie c. Problem nie jest widoczny. Jednak dziwne.

5
  1. Upewnij się, że wyświetlasz okno dialogowe z kontekstem aplikacji.
  2. Upewnij się, że żadne dwa zdarzenia nie przychodzą i nie trafiają w tę samą część kodu.i.e, gdy pojawi się okno dialogowe, jeszcze jedno zdarzenie z kodu c, aby wyświetlić okno dialogowe.
  3. Upewnij się, że aplikacja ma wystarczającą ilość pamięci, aby działać płynnie.
+0

1) Aktywność jest uruchamiana z TabActivity Context.2) jest uważnie uważana za właściwą.) Dobrze, ale jest najtrudniejsza część wiedzieć. – NitZRobotKoder

+1

Nie wygląda na problem z brakującą pamięcią, z [ViewRootImpl.java] (https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewRootImpl.java) : 'Log.e (TAG," Nie można zablokować powierzchni ", e);' _Nie zakładaj, że jest to spowodowane brakiem pamięci, może to być coś innego, a jeśli jest coś innego, to możemy zabić rzeczy (lub nas) bez powodu._ – ozbek

+0

@NitZRobotKoder użyłeś niestandardowego okna dialogowego? Czy możesz opublikować swój kod dialogowy? – TheFlash

3

Wystąpił błąd spowodowany brakiem ekranu gotowości do wyświetlenia czegokolwiek w momencie dzwonienia pod numer dialog.show().

Innym (możliwe) rozwiązaniem dla Ciebie jest użycie okna systemowego jak w poniższym przykładzie:

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

Upewniamy się, że aktywność jest wznawiana przed wyświetleniem okna dialogowego. – NitZRobotKoder

1

Kiedy widziałem (kanał ~ Consumer zamknięty kanał wejściowy) przed następnie błędu Znalazłem go w celu wskazania, że ​​aplikacja została zamykania albo wzoru lub wyjątek podniesiony gdzie indziej. Moje przeczucie polegałoby na tym, że kończysz swoją działalność lub spotykasz się z wyjątkiem w tym samym czasie, w którym wyświetla się okno dialogowe, co powoduje, że Twoja aplikacja zaczyna wychodzić. Dodałbym również więcej rejestrowania do każdego miejsca, do którego zadzwonisz, aby sprawdzić, czy przypadkiem nie kończysz, gdy wyświetlasz okno dialogowe.

+0

Wywołanie zakończenia jest dobrze zrobione! – NitZRobotKoder

2

Po obejrzeniu kodu, polecam usunąć finish() w swoim BroadcastReceiver i uruchomić program (do celów testowych). Problem, który widzisz, może się zdarzyć z powodu uruchamiania i kończenia połączenia z numerem Activity w tym samym czasie.

+0

Wykończenie połączenia jest dobrze wykonane! – NitZRobotKoder