l’activité Android a fui la fenêtre com.android.internal.policy.impl.phonewindow $ decorview Issue

Je travaille avec une application Android pour afficher une erreur réseau.

NetErrorPage.java

package exp.app; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class NetErrorPage extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.neterrorlayout); Button reload=(Button)findViewById(R.id.btnReload); reload.setOnClickListener(this); showInfoMessageDialog("Please check your network connection","Network Alert"); } public void onClick(View arg0) { if(isNetworkAvailable()) { Intent myIntent = new Intent((Activity)NetErrorPage.this, MainActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); ((Activity)NetErrorPage.this).startActivity(myIntent); finish(); } else showInfoMessageDialog("Please check your network connection","Network Alert"); } public void showInfoMessageDialog(Ssortingng message,Ssortingng title) { AlertDialog alertDialog = new AlertDialog.Builder(NetErrorPage.this).create(); alertDialog.setTitle("Network Alert"); alertDialog.setMessage(message); alertDialog.setButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { dialog.cancel(); } }); alertDialog.show(); } private boolean isNetworkAvailable() { NetworkInfo ActiveNetwork; @SuppressWarnings("unused") Ssortingng IsNetworkConnected; @SuppressWarnings("unused") Ssortingng ConnectionType; ConnectivityManager connectivitymanager; connectivitymanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); try { ActiveNetwork=connectivitymanager.getActiveNetworkInfo(); ConnectionType=ActiveNetwork.getTypeName(); IsNetworkConnected=Ssortingng.valueOf(ActiveNetwork.getState()); return true; } catch(Exception error) { return false; } } } 

mais je reçois l’erreur comme ci-dessous,

 08-17 11:59:08.019: E/WindowManager(16460): Activity exp.app.NetErrorPage has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40534a18 that was originally added here 08-17 11:59:08.019: E/WindowManager(16460): android.view.WindowLeaked: Activity exp.app.NetErrorPage has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40534a18 that was originally added here 08-17 11:59:08.019: E/WindowManager(16460): at android.view.ViewRoot.(ViewRoot.java:263) 08-17 11:59:08.019: E/WindowManager(16460): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 08-17 11:59:08.019: E/WindowManager(16460): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 08-17 11:59:08.019: E/WindowManager(16460): at android.view.Window$LocalWindowManager.addView(Window.java:424) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.Dialog.show(Dialog.java:241) 08-17 11:59:08.019: E/WindowManager(16460): at sync.directtrac.NetError.showInfoMessageDialog(NetErrorPage.java:114) 08-17 11:59:08.019: E/WindowManager(16460): at sync.directtrac.NetError.onCreate(NetErrorPage.java:26) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 08-17 11:59:08.019: E/WindowManager(16460): at android.os.Handler.dispatchMessage(Handler.java:99) 08-17 11:59:08.019: E/WindowManager(16460): at android.os.Looper.loop(Looper.java:130) 08-17 11:59:08.019: E/WindowManager(16460): at android.app.ActivityThread.main(ActivityThread.java:3687) 08-17 11:59:08.019: E/WindowManager(16460): at java.lang.reflect.Method.invokeNative(Native Method) 08-17 11:59:08.019: E/WindowManager(16460): at java.lang.reflect.Method.invoke(Method.java:507) 08-17 11:59:08.019: E/WindowManager(16460): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 08-17 11:59:08.019: E/WindowManager(16460): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 08-17 11:59:08.019: E/WindowManager(16460): at dalvik.system.NativeStart.main(Native Method) 

J’ai cherché plus … mais je n’ai aucune idée juste pour effacer ceci.

Ce que je veux, c’est que lors du chargement de cette page, la mise en page soit ajoutée et que la boîte de dialog soit affichée.

S’il vous plaît aidez-moi à effacer cette erreur

Note: j’ai essayé cela aussi

 @Override protected void onResume() { super.onResume(); runOnUiThread(new Runnable() { public void run() { showInfoMessageDialog("Please check your network connection","Network Alert"); } }); } 

Merci les gars de me donner beaucoup de suggestions . Finalement, j’ai une solution. C’est-à-dire que j’ai lancé l’intention de NetErrorPage deux fois. Une fois, j’ai vérifié la disponibilité de la connexion réseau et lancé l’événement intent in page started. deuxième fois, si la page a une erreur, alors j’ai lancé l’intention dans l’événement OnReceivedError. La première boîte de dialog n’est donc pas fermée avant que la deuxième boîte de dialog ne soit appelée. Alors j’ai eu une erreur.

Raison de l’erreur : J’ai appelé la méthode showInfoMessageDialog deux fois avant de fermer le premier.

Maintenant, j’ai supprimé le deuxième appel et effacé l’erreur :-).

Changer ce dialog.cancel(); à dialog.dismiss();

La solution consiste à appeler dismiss() sur le Dialog vous avez créé dans NetErrorPage.java:114 avant de quitter l’ Activity , par exemple dans onPause() .

Les vues font référence à leur Context parent (extrait de l’argument constructeur). Si vous laissez une Activity sans détruire les Dialog et les autres View créées dynamicment, ils contiennent toujours cette référence à votre Activity (si vous avez créé ceci comme Context : comme new ProgressDialog(this) ), il ne peut donc pas être collecté par le GC. provoquant une fuite de mémoire.

Dans mon cas, finish() exécuté immédiatement après qu’une boîte de dialog a été affichée.

S’il vous plaît essayez de cette façon et faites le moi savoir:

 Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.neterrorlayout); mContext=NetErrorPage.this; Button reload=(Button)findViewById(R.id.btnReload); reload.setOnClickListener(this); showInfoMessageDialog("Please check your network connection","Network Alert"); } public void showInfoMessageDialog(Ssortingng message,Ssortingng title) { new AlertDialog.Builder(mContext) .setTitle("Network Alert"); .setMessage(message); .setButton("OK",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { dialog.cancel(); } }) .show(); } 

La boîte de dialog doit être démarrée uniquement après l’initialisation des états de la fenêtre de l’activité. Cela se produit uniquement après onresume.

Alors appelle

 runOnUIthread(new Runnable(){ showInfoMessageDialog("Please check your network connection","Network Alert"); }); 

dans votre fonction OnResume. Ne créez pas de boîtes de dialog dans OnCreate
Modifier:

utilisez ceci

 Handler h = new Handler(); h.postDelayed(new Runnable(){ showInfoMessageDialog("Please check your network connection","Network Alert"); },500); 

dans votre onresume au lieu de showonuithread

  @Override protected void onPostExecute(final Boolean success) { mProgressDialog.dismiss(); mProgressDialog = null; 

définir la valeur null fonctionne pour moi

J’ai eu cette erreur mais c’est résolu intéressant. Comme premier, j’ai eu cette erreur au niveau api 17. Quand j’appelle un thread (AsyncTask ou autres) sans dialog de progression puis j’appelle à nouveau une autre méthode de thread en utilisant le dialog de progression, j’ai eu ce crash et la raison .

Dans mon cas, il y a deux résultats qui;

  • J’ai pris show(); boîte de dialog de la méthode de progression avant que le premier thread ne démarre, puis j’ai pris dismiss(); boîte de dialog de la méthode de progression avant la fin du dernier thread.

Alors :

 ProgresDialog progressDialog = new ... //configure progressDialog progressDialog.show(); start firstThread { ... } ... start lastThread { ... } //be sure to finish threads progressDialog.dismiss(); 
  • C’est tellement étrange mais cette erreur a une capacité à se détruire au moins pour moi 🙂