web-dev-qa-db-ja.com

androidアクティビティがウィンドウcom.Android.internal.policy.impl.phonewindow $ decorviewの問題をリークしました

ネットワークエラーを表示するためにAndroidアプリケーションを使用しています。

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;
        }
    }    
}

しかし、私は次のようなエラーを受け取っています、

08-17 11:59:08.019: E/WindowManager(16460): Activity exp.app.NetErrorPage has leaked window [email protected] that was originally added here
08-17 11:59:08.019: E/WindowManager(16460): Android.view.WindowLeaked: Activity exp.app.NetErrorPage has leaked window [email protected] 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)

私はもっ​​と検索しました...しかし、私はこれをクリアする正しい考えを持っていません。

私が欲しいのは、このページをロードするときに、レイアウトを追加し、ダイアログを表示する必要があることです。

このエラーをクリアするのを手伝ってください

注:私もこれを試しました

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

    }
65
Ponmalar

たくさんの提案をくれてありがとう、みんな。最終的に私は解決策を得た。つまり、NetErrorPageインテントを2回開始しました。かつて、ネット接続の可用性を確認し、ページ開始イベントでインテントを開始しました。 2回目、ページにエラーがある場合、OnReceivedErrorイベントでインテントを開始しました。したがって、2番目のダイアログが呼び出される前に、最初のダイアログは閉じられません。だからエラーが出ました。

エラーの理由:最初のメソッドを閉じる前にshowInfoMessageDialogメソッドを2回呼び出しました。

これで、2番目の呼び出しとClearedエラーを削除しました:-)。

74
Ponmalar

これをdialog.cancel();からdialog.dismiss();に変更します

解決策は、Dialogを終了する前にNetErrorPage.Java:114で作成したActivitydismiss()を呼び出すことです。 onPause()にあります。

ビューには、親のContext(コンストラクター引数から取得)への参照があります。 Activitysおよびその他の動的に作成されたDialogsを破壊せずにViewを残す場合、Activityへのこの参照を保持します(これをContextとして作成した場合) :new ProgressDialog(this))のように、GCで収集できないため、メモリリークが発生します。

57
Chirag

私の場合、ダイアログが表示された直後にfinish()が実行されました。

5
CoolMind

この方法を試してください

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

ダイアログは、アクティビティのウィンドウ状態が初期化された後にのみ開始する必要があります。これは、onresumeの後にのみ発生します。

だから電話

runOnUIthread(new Runnable(){

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

onResume関数で。 OnCreateでダイアログを作成しないでください
編集:

これを使って

Handler h = new Handler();

h.postDelayed(new Runnable(){

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

showonuithreadの代わりにOnresumeで

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

値nullを設定するとうまくいきます

1
Carlos Rojas

私はこのエラーを受け取りましたが、興味深いことに解決されました。最初に、私はこのエラーをAPIレベル17で受け取りました。

私の場合、次の2つの結果があります。

  • 最初のスレッドが開始する前にshow();進捗ダイアログのメソッドを取得し、最後のスレッドが終了する前にdismiss();進捗ダイアログのメソッドを取得しました。

そう :

ProgresDialog progressDialog = new ...

//configure progressDialog 

progressDialog.show();

start firstThread {
...
}

...

start lastThread {
...
} 

//be sure to finish threads

progressDialog.dismiss();
  • これはとても奇妙ですが、そのエラーには少なくとも私にとってはそれ自体を破壊する能力があります:)
0
oguzhan