0

こんにちは、Android phonegap アプリを開発しました。ダイアログが表示され、画面の向きが変わると、logcat にエラーが表示されます。これを解決する方法

これが私のlogcatエラーです:

E/WindowManager(5759): Activity com.example.Service.NotificationAlert has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@412c93c0 that was originally added here
E/WindowManager(5759): android.view.WindowLeaked: Activity com.example.Service.NotificationAlert has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@412c93c0 that was originally added here
E/WindowManager(5759):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
E/WindowManager(5759):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
E/WindowManager(5759):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
E/WindowManager(5759):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
E/WindowManager(5759):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
E/WindowManager(5759):  at android.app.Dialog.show(Dialog.java:278)
E/WindowManager(5759):  at com.example.Service.NotificationAlert$1.handleMessage(NotificationAlert.java:103)
E/WindowManager(5759):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/WindowManager(5759):  at android.os.Looper.loop(Looper.java:137)
E/WindowManager(5759):  at android.app.ActivityThread.main(ActivityThread.java:4424)
E/WindowManager(5759):  at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager(5759):  at java.lang.reflect.Method.invoke(Method.java:511)
E/WindowManager(5759):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/WindowManager(5759):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/WindowManager(5759):  at dalvik.system.NativeStart.main(Native Method)

解決策を教えてください。よろしくお願いします。

これが私のコードです:

 AlertDialog alertDialog = new AlertDialog.Builder(NotificationAlert.this).create();
    alertDialog.setTitle("Mobilyzer");
    msgCountBundle = getIntent().getExtras();
    messageCount = msgCountBundle.getInt("Count");
    userId = msgCountBundle.getInt("userid");
    if (messageCount > 1) {
        alertDialog
                .setMessage("You have " + messageCount + " New Messages");
    } else {
        alertDialog.setMessage("You have " + messageCount + " New Message");
    }

alertDialog.show();
new Timer().schedule(new task(), 30000);

private class task extends TimerTask 
{
    public void run() 
    {
        toastHandler.sendEmptyMessage(0);
    }
}

private final Handler toastHandler = new Handler() {
    public void handleMessage(Message msg) {
        if(alertDialog.isShowing())
        {
            try
            {
                alertDialog.dismiss();
                finish();
                Log.i("alertdialog","hide alert dialog");
            }
            catch(IllegalArgumentException e)
            {
                Log.e("illegal ","illegal exception in dialog"+e);
            }
            catch(Exception e)
            {
                Log.e("illegal ","exception in dialog"+e);
            }
        }
        Log.i("alertdialog","show alert dialog");
    }
};
4

3 に答える 3

0

一時停止されたときに明示的に呼び出すことによって却下されなかったNotificationAlert Activityを示しています。オブジェクトへの参照を保持し、それを呼び出します。Dialogdismiss()ActivityDialogonPause()dismiss()

@Override
protected void onPause() {
    if (myDialog != null) {
        myDialog.dismiss();
    }
    super.onPause();
}
于 2013-02-26T12:12:54.583 に答える
0

これは、アプリがクラッシュしている他の例外が原因であり、ダイアログにウィンドウ リーク例外がスローされていることが示されているためです。

とにかく、ダイアログがnullではなく、アクティビティが終了すると、ウィンドウリーク例外が発生します。そのため、上記の onPause() で、またはインテントを開始する前のようにアクティビティが新しい画面に移動する場所で、ダイアログを null にする必要があります。ここで、ウィンドウ リーク例外を処理できるようにキャッチでダイログを無効にすることができますが、コードには他の例外があります。完全な logcat を提供します。

于 2013-02-26T12:49:07.493 に答える
0

アプリケーションのフローを確認してください。アプリケーションでは、ダイアログを複数回追加していると思います。したがって、アクティビティ ビューにダイアログを 1 つだけ追加して解決してみてください。

于 2013-02-26T12:15:36.530 に答える