6

我有一個應用程序TabActivity,其中我每次從我的引擎(NDK C代碼)獲得回調時都會顯示一個對話框。我確保應用程序處於恢復狀態時顯示對話框。Android:活動對話框/對話框意外消失

從引擎收到回調後,我開始NetworkDownDialog活動,但這會導致對話框停留一秒鐘然後消失。如果我使用DialogAlertDialog,則會發生同樣的情況。最奇怪的是,消失似乎是隨機的(並不總是發生)。

這是一個S3設備。這是怎麼回事?

編輯在23/05/2013

網絡故障的對話框代碼

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級本地代碼中的內存損壞是否可能導致此問題?我在UI方面做錯了什麼?我完全卡住了...

在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. 確保沒有兩個事件出現,並在您要顯示對話框時點擊code.i.e的相同部分,從c代碼再次顯示一個事件以顯示對話框。
  3. 確保您的應用程序有足夠的內存來平穩運行。
+0

1)活動開始與TabActivity上下文.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

當我看到(信道〜消費者關閉輸入信道),隨後的錯誤之前,我已經發現它以指示該應用程序是閉合或者通過設計或其他地方產生的異常。我的直覺是你要麼終止你的活動,要麼在對話框顯示的同時遇到異常,導致你的應用程序開始退出。我還會將更多日誌記錄添加到您稱之爲完成的任何位置,以驗證您在顯示對話框時不會意外完成。

+0

完成呼叫照顧得很好! – NitZRobotKoder

2

看到您的代碼後,我會建議您在BroadcastReceiver中刪除finish()並運行程序(用於測試目的)。您看到的問題可能是由於您的Activity幾乎在同一時間開始和結束而發生的。

+0

完成電話妥善保管! – NitZRobotKoder