首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Logcat显示WindowLeaked

Logcat显示WindowLeaked
EN

Stack Overflow用户
提问于 2015-06-12 08:00:16
回答 2查看 63关注 0票数 0

即使在我的应用程序中没有崩溃。但是logcat显示了这个调试日志。我想知道是什么导致了这个问题。我不太关心线程,所以这可能与线程的糟糕使用有关。

代码语言:javascript
运行
复制
06-12 12:37:37.349  12433-12433/com.ets.medecord E/WindowManager﹕ Activity com.ets.medecord.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405403d0 that was originally added here
    android.view.WindowLeaked: Activity com.ets.medecord.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405403d0 that was originally added here
            at android.view.ViewRoot.<init>(ViewRoot.java:259)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
            at android.view.Window$LocalWindowManager.addView(Window.java:465)
            at android.app.Dialog.show(Dialog.java:241)
            at com.ets.medecord.LoginActivity.attemptLogin(LoginActivity.java:125)
            at com.ets.medecord.LoginActivity.access$300(LoginActivity.java:45)
            at com.ets.medecord.LoginActivity$1.onClick(LoginActivity.java:87)
            at android.view.View.performClick(View.java:2506)
            at android.view.View$PerformClick.run(View.java:9112)
            at android.os.Handler.handleCallback(Handler.java:587)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3835)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
            at dalvik.system.NativeStart.main(Native Method)

这是我正在使用的代码,看看能不能。在这里,我试图在工作线程完成它的工作后关闭对话框。

代码语言:javascript
运行
复制
final String user_email = email;
final String user_password = password;
Log.d(TAG, "email:" + email);
Log.d(TAG, "password:" + password);
pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading....");
pDialog.show();
new Thread(new Runnable() {
    @Override
    public void run() {
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse httpResponse = null;
        HttpPost httpPost = new HttpPost("http://elitetotality.com/medicord/");
        List<NameValuePair> nameValuePair = new ArrayList<>();
        nameValuePair.add(new BasicNameValuePair("tag", "login"));
        nameValuePair.add(new BasicNameValuePair("email", user_email));
        nameValuePair.add(new BasicNameValuePair("password", user_password));
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try {
            httpResponse = httpClient.execute(httpPost);
        } catch (IOException e) {
            e.printStackTrace();
        }


        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpResponse.getEntity().getContent(), "UTF-8"));
            StringBuilder builder = new StringBuilder();

            for (String line = null; (line = reader.readLine()) != null; ) {
                builder.append(line).append("\n");
            }

            String httpResponseString = builder.toString();
            strResponse = httpResponseString;
            Log.d(TAG, httpResponseString);

        } catch (IOException e) {
            e.printStackTrace();
        }

        handler.post(new Runnable() {
            @Override
            public void run() {
                pDialog.hide();
                pDialog.dismiss();
            }
        });
        JSONObject reader;
        try {
            if(strResponse != null){
                reader = new JSONObject(strResponse);
                String error = reader.get("error").toString();
                Log.d(JSON_TAG, error);
                if(error.equals("false")) {
                    String userName = reader.getJSONObject("user").get("name").toString();
                    editor.putBoolean("isLoggedIn", true);
                    editor.putString("userName", userName);
                    editor.apply();
                    startActivity(new Intent(getApplicationContext(), RandomProfileActivity.class));
                    finish();
                } else {

                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),"Either email or password is incorrect!"
                                    ,Toast.LENGTH_SHORT).show();
                        }
                    });
                }


            }

        } catch(JSONException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }


    }
}).start();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-12 09:43:05

-更详细的答案--

更改代码的这一部分:

代码语言:javascript
运行
复制
    handler.post(new Runnable() {
        @Override
        public void run() {
            pDialog.hide();
            pDialog.dismiss();
        }
    });

至:

代码语言:javascript
运行
复制
pDialog.dismiss();

Handler.post将运行的代码放在当前方法完成后的某个时间运行。这就是为什么你收到了漏水的警告,你泄露了一个对话框。

Android提供AsyncTask来进行短期异步操作。您可以使用onPreExecute来显示您的Dialog,并使用onPostExecute来处理它。

票数 1
EN

Stack Overflow用户

发布于 2015-06-12 09:09:32

在退出Dialog之后,您正在试图解雇Activity。因为即使在您的活动被销毁之后,您的工作线程仍将继续执行。如果在Activity被销毁后试图关闭对话框,它将导致leaked window exception

尝试将此代码添加到您的活动中。

代码语言:javascript
运行
复制
@Override
public void onDestroy() {
    super.onDestroy();
    if (dialog != null) {
        dialog.dismiss();
        dialog = null;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30798142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档