Je reçois une erreur de fuite de fenêtre au moment de l'exécution à cause de l'utilisation d'un AlertDialog.
J'ai signalé la ligne d'erreur dans le code ci-dessous:
Trace de la pile:
08-18 02:48:04.489 28893-28893/? E/WindowManager﹕ Activity com.ms.ha.fragment.FirstActivity has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
Android.view.WindowLeaked: Activity com.ms.ha.fragment.FirstActivity has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
at Android.view.ViewRootImpl.<init>(ViewRootImpl.Java:345)
at Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.Java:239)
at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:69)
at Android.app.Dialog.show(Dialog.Java:281)
at com.ms.ha.fragment.TourGuideLoadURLFragment$WebAppInterface.moveToNextScreen(TourGuideLoadURLFragment.Java:116)
at Android.webkit.WebViewCore.nativeMouseClick(Native Method)
at Android.webkit.WebViewCore.nativeMouseClick(Native Method)
at Android.webkit.WebViewCore.access$6800(WebViewCore.Java:59)
at Android.webkit.WebViewCore$EventHub.dispatchWebKitEvent(WebViewCore.Java:1793)
at Android.webkit.WebViewInputDispatcher.dispatchWebKitEvent(WebViewInputDispatcher.Java:689)
at Android.webkit.WebViewInputDispatcher.dispatchWebKitEvents(WebViewInputDispatcher.Java:639)
at Android.webkit.WebViewInputDispatcher.access$800(WebViewInputDispatcher.Java:78)
at Android.webkit.WebViewInputDispatcher$WebKitHandler.handleMessage(WebViewInputDispatcher.Java:1153)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:137)
at Android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.Java:814)
at Java.lang.Thread.run(Thread.Java:841)
FirstActivity.Java:
public class FirstActivity extends FragmentActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_tour_guide_web);
.......
.......
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
}
public class WebAppInterface {
Context mContext;
/**
* Instantiate the interface and set the context
*/
WebAppInterface(Context c) {
mContext = c;
}
/**
* Intent - Move to next screen
*/
@JavascriptInterface
public void moveToNextScreen() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set title
alertDialogBuilder.setTitle("Your Title");
// set dialog message
alertDialogBuilder
.setMessage("Click yes!")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(i);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// if this button is clicked, just close
// the dialog box and do nothing
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show(); --->leak window error
}
}
}
Je ne sais pas comment résoudre ce problème.
Vous obtenez une erreur car ProgressDialog
est en cours d'exécution pendant que votre Activity
est détruit. Vous devriez fermer la boîte de dialogue avant de commencer une nouvelle Activity
.
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
}
});
J'espère que ça aide!
Annulez le alertDialog dans la méthode onPause (). c'est-à-dire appeler alertDialog.dismiss ()
Remarque: des exceptions WindowLeaked se produisent généralement si les boîtes de dialogue ne sont pas fermées avant la fin de l'activité.
Vous devez avoir besoin de fermer/annuler votre dialogue une fois l’activité terminée. Cela se produit généralement si les dialogues ne sont pas fermés avant la fin de l'activité.
Vous pouvez également obtenir une exception WindowLeaked si vous n'êtes pas dans le fil de l'interface utilisateur lorsque vous essayez d'afficher la boîte de dialogue. Solution facile:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
// show dialog here
}
});