web-dev-qa-db-fra.com

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

Je travaille avec Android application 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(String message,String 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")
        String IsNetworkConnected;
        @SuppressWarnings("unused")
        String ConnectionType;
        ConnectivityManager connectivitymanager;
        connectivitymanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);        
        try
        {           
            ActiveNetwork=connectivitymanager.getActiveNetworkInfo();
            ConnectionType=ActiveNetwork.getTypeName(); 
            IsNetworkConnected=String.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.<init>(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 bonne idée 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 dialogue apparaisse.

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

Note: J'ai essayé aussi

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

    }
65
Ponmalar

Merci les gars de me donner beaucoup de suggestions. Enfin j'ai une solution. C'est-à-dire que j'ai lancé l'intention de NetErrorPage à deux reprises. Une fois, j’ai vérifié la disponibilité de la connexion Internet et lancé l’intention dans la page. deuxième fois, si la page a une erreur, alors j'ai commencé l'intention dans l'événement OnReceivedError. Ainsi, la première boîte de dialogue n'est pas fermée, avant que la deuxième boîte de dialogue soit appelée. Alors que j'ai eu une erreur.

Raison de l'erreur: J'ai appelé la méthode showInfoMessageDialog deux fois avant de fermer la première.

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

74
Ponmalar

Remplacez ce dialog.cancel(); par dialog.dismiss();

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

Les vues font référence à leur parent Context (pris à partir de l'argument constructeur). Si vous laissez un Activity sans détruire Dialogs et d'autres Views créés dynamiquement, ils conservent toujours cette référence à votre Activity (si vous avez créé avec ceci comme Context: comme new ProgressDialog(this)), il ne peut donc pas être collecté par le CPG, ce qui provoquerait une fuite de mémoire.

57
Chirag

Dans mon cas, finish() est exécuté immédiatement après l'affichage d'un dialogue.

5
CoolMind

S'il vous plaît essayer de cette façon et laissez-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(String message,String 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();
}
4
Haresh Chaudhary

La boîte de dialogue ne doit être démarrée qu’après l’initialisation des états de la fenêtre de l’activité. Ceci se produit uniquement après la reprise.

Alors appelez

runOnUIthread(new Runnable(){

    showInfoMessageDialog("Please check your network connection","Network Alert");
});

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

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

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

définir la valeur null fonctionne pour moi

1
Carlos Rojas

J'ai eu cette erreur mais c'est résolu intéressant. Comme tout d’abord, j’ai eu cette erreur au niveau de l’API 17. Quand j’appelle un fil (AsyncTask ou autres) sans boîte de dialogue de progression, j’appelle de nouveau une méthode de fil à l’aide de la boîte de dialogue de progression. .

Dans mon cas, il y a deux résultats:

  • J'ai pris show(); méthode de dialogue de progression avant le premier thread puis j'ai pris dismiss(); méthode de dialogue 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 si étrange mais cette erreur a la capacité de se détruire au moins pour moi :)
0
oguzhan