6

У меня есть приложение с TabActivity, в котором я показываю диалог каждый раз, когда получаю обратный вызов от моего движка (код NDK C). Я уверен, что диалог отображается, когда приложение находится в состоянии возобновления.Android: Диалог активности/Диалог неожиданно исчезает

После получения обратного вызова от двигателя, я запускаю операцию NetworkDownDialog, но это заставляет диалог оставаться на секунду, а затем исчезать. То же самое происходит, если я использую Dialog или AlertDialog. Самое странное, что исчезновение кажется случайным (не всегда бывает).

Это устройство S3. Что происходит?

правка 23/05/2013

Network вниз Dialog 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(); 
     } 
    }; 
} 

В журналах, это то, что я вижу:

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

активность Диалог отображается

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

В этом случае ActivityDialog исчез после указанного выше.

Почему мой диалог исчезает? Возможно ли, что повреждение памяти на моем собственном коде уровня C вызывает эту проблему? Я делаю что-то не так на стороне интерфейса? Я полностью застрял ...

правка 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 удалили мой tabactivity.Will это может вызвать диалоговое удалить?

+0

уверены, что вы не вызываете диалог отмены в этом процессе? – Meher

+0

Нет, я не звоню Отмена. – NitZRobotKoder

+0

Каковы параметры аппаратного ускорения? – ozbek

ответ

0

Хорошо, проблема была с кодом c Некоторое файловое дескриптор fd коррумпированное вызывало эту проблему. Так как проблема была решена на уровне c, проблема не была видна.

5
  1. Удостоверьтесь, что вы показываете диалог с контекстом приложения.
  2. Убедитесь, что нет двух событий и нажмите одну и ту же часть кода.i.e, когда вы собираетесь отобразить диалоговое окно, еще одно событие из кода c, чтобы отобразить диалог.
  3. Убедитесь, что в вашем приложении достаточно памяти для бесперебойной работы.
+0

1) Запущена активность с помощью TabActivity Context.2). 3) Правильно, но это сложнее часть знать. – NitZRobotKoder

+1

Не похоже на проблему с памятью, из [ViewRootImpl.java] (https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewRootImpl.java) : 'Log.e (TAG,« Невозможно заблокировать поверхность », e);' 'Не предполагайте, что это из-за нехватки памяти, это может быть что-то другое, и если это что-то еще, мы можем убить вещи (или само собой) без причины. – ozbek

+0

@NitZRobotKoder вы использовали пользовательский диалог? можете ли вы отправить свой код диалога? – TheFlash

3

Ошибка, которую вы получаете, связана с тем, что экран не готов отображать что-либо в то время, когда вы вызываете dialog.show().

Другое (возможно) для вас решения заключается в использовании системного диалогового окна, как в этом примере:

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

Мы уверены, что активность возобновлена ​​до того, как мы покажем диалог. – NitZRobotKoder

1

Я думаю, что проблема связана с поверхностью не запертой. Вот несколько решений, которые я нашел в SO.

Надеюсь, они помогут.

android-canvas-locking и android-draw-on-camera-preview

+0

Мы действительно не делаем никаких рисунков в нашем коде. – NitZRobotKoder

1

Когда я видел (канал ~ Потребитель закрыт входной канал) перед последующим ошибки я нашел его, чтобы указать, что приложение было закрытие либо конструкции или исключения повышенной в другом месте. Моей догадкой было бы то, что вы либо прекращаете свою деятельность, либо сталкиваетесь с исключением в то же время, когда отображается диалоговое окно, в результате чего ваше приложение начинает выходить. Кроме того, я бы добавил больше журнала в любое место, которое вы называете отделом, чтобы убедиться, что вы случайно не закончите, когда вы показываете диалог.

+0

Завершить звонок бережно! – NitZRobotKoder

2

После просмотра кода, я бы рекомендовал удалить finish() в ваш BroadcastReceiver и запустить вашу программу (для целей тестирования). Проблема, которую вы видите, может произойти из-за того, что ваш Activity начинается и заканчивается почти одновременно.

+0

Завершить звонок бережно! – NitZRobotKoder

Смежные вопросы