Android : Window Manager : android 视图窗口泄露

Posted

技术标签:

【中文标题】Android : Window Manager : android 视图窗口泄露【英文标题】:Android : Window Manager : android view window leaked 【发布时间】:2016-06-14 19:24:22 【问题描述】:

在我解决了我的第一个问题之后,这个问题出现了:(请帮我解决它..

03-02 12:47:02.785 9439-9439/com.ucu.ccs.clas-s-record E/WindowManager﹕android.view.WindowLeaked: Activity com.ucu.ccs.clas-s-record.Login 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView6d17cc4 V.E..... R......D 0,0-1002,348 最初添加在这里 在 android.view.ViewRootImpl.(ViewRootImpl.java:465) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:277) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 在 android.app.Dialog.show(Dialog.java:312) 在 com.ucu.ccs.clas-s-record.Login$AttemptLogin.onPreExecute(Login.java:158) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 在 android.os.AsyncTask.execute(AsyncTask.java:535) 在 com.ucu.ccs.clas-s-record.Login.isOnline(Login.java:113) 在 com.ucu.ccs.clas-s-record.Login$1.onClick(Login.java:73) 在 android.view.View.performClick(View.java:5197) 在 android.view.View$PerformClick.run(View.java:20926) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5942) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

这是我的代码:

buttonLogin.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                String instructor_id = editUser.getText().toString().trim();
                String password = editPass.getText().toString().trim();

                SharedPreferences preferences = getSharedPreferences("MyApp", MODE_PRIVATE);
                preferences.edit().putString("password", password).commit();
                preferences.edit().putString("inst_id", instructor_id).commit();

                if (editUser.getText().toString().equals("") || editPass.getText().toString().equals(""))
                    Toast.makeText(getApplicationContext(),"Please enter Instructor ID and Password", Toast.LENGTH_LONG).show();
                else 
                    isOnline();
                

            
        );

public boolean isOnline()
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnectedOrConnecting())
            new AttemptLogin().execute();
        else 
            checkInternet();
        
        return false;
    

class AttemptLogin extends AsyncTask<String, String, String> 
        boolean failure = false;
        String inst_id = editUser.getText().toString();
        String password = editPass.getText().toString();

        @Override
        protected void onPreExecute() 
            super.onPreExecute();
            pDialog = new ProgressDialog(Login.this);
            pDialog.setMessage("Attempting login...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        

        @Override
        protected String doInBackground(String... params) 
            int success;
            try
                List<NameValuePair> mList = new ArrayList<NameValuePair>();
                mList.add(new BasicNameValuePair("instructor_id", inst_id));
                mList.add(new BasicNameValuePair("password", password));

                Log.d("request!", "starting");

                JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST", mList);
                Log.d("Login attempt", json.toString());

                success = json.getInt(TAG_SUCCESS);
                if (success == 1) 
                    Log.d("Login Successful!", json.toString());
                    Intent i = new Intent(Login.this, MainActivity.class);
                    startActivity(i);
                    //finish();
                    return json.getString(TAG_MESSAGE);
                else
                    Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                    return json.getString(TAG_MESSAGE);
                

            catch (JSONException e)
                e.printStackTrace();
            
            return null;
        

        @Override
        protected void onPostExecute(String s) 
            super.onPostExecute(s);
            session.setLogin(true);
            pDialog.dismiss();
            if (s != null)
                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
            
        
    

【问题讨论】:

你做了什么?我的意思是你点击按钮后做了什么? 我只需单击按钮,然后在处理完应用程序崩溃后会出现进度对话框 Take a look at this it seems that your Dialog is still showing. 您为什么担心这个警告?是不是让你的应用崩溃了 【参考方案1】:

如果您的活动已被销毁但您的对话框仍在显示,则会发生此错误。所以你必须在你的活动中添加这些代码。

onDestroy()

@Override
public void onDestroy() 
    super.onDestroy();
    if (dialog != null) 
        dialog.dismiss();
        dialog = null;
    

希望这对你有用。

【讨论】:

【参考方案2】:

实际上你的活动已经完成了,所以你需要关闭对话框。

在 onPause() 中添加以下代码

if(isFinishing())
    if (pDialog!= null) 
        pDialog.dismiss();
        pDialog= null;
    

【讨论】:

【参考方案3】:

您尝试在退出 Activity 后显示 Dialog。 在您的 doInBackground 中,当您转移活动时,在 startActivity(i) 之前关闭对话框 试试这个,让我知道它是否有效。

【讨论】:

以上是关于Android : Window Manager : android 视图窗口泄露的主要内容,如果未能解决你的问题,请参考以下文章

eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法

如何解决Android SDK Manager 更新失败

解决system_server crash,java.lang.IllegalStateException: has already been added to the window manager.

[Package Manager Window] Error searching for packages.

Window与其管理者的秘密

Window与其管理者的秘密