【问题标题】:JSON object leaks windowJSON 对象泄漏窗口
【发布时间】:2016-10-11 12:20:29
【问题描述】:

我得到一个名为“user”的 json 对象,它包含两个字段,名称和电子邮件。 我想将这两个值显示为 toast,但 LogCat 显示窗口泄漏错误。

这是我的 AsyncTask 类代码:

 private class Data extends AsyncTask<String,String,JSONObject>
    {ProgressDialog pd;
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub

            pd=new ProgressDialog(SignUp.this);
            pd.setMessage("Loading....");
            pd.setCancelable(false);

            pd.show();
            super.onPreExecute();
        }
        @Override
        protected JSONObject doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            jparseLogin j=new jparseLogin();
            JSONObject obj=
                    j.makeHttpRequest("http://projectred.in/phploginwebservice/index.php?" +
                            "tag=register&fname="+fsname+"&lname="+lsname+"&email="+emailid+"&password="+password+"&gender="+gender+
                            "&mobile="+mobile+"&blood_grp="+bloodgroup+"&age="+agee+"verify=0");

            return obj;
        }
        @Override
        protected void onPostExecute(JSONObject result) {
            TinyDB db1 = new TinyDB(SignUp.this);
            // TODO Auto-generated method stub
            //StringBuilder b=new StringBuilder();
            pd.dismiss();
            try{
                String s=result.getString("success");
                //String u=result.getString("uid");

                //db1.putString("uid",u);
                if(s.equals("1"))
                {   JSONObject jo = result.getJSONObject("user");
                    for(int i=0; i<5;i++) {


                        String name = jo.getString("name");
                        String email = jo.getString("email");

                        Toast.makeText(SignUp.this,""+name+","+email,Toast.LENGTH_LONG).show();
                        //flag = true;

                        Intent intent = new Intent(SignUp.this, VerifyNumber.class);
                        intent.putExtra("mobile", mobile);
                        startActivity(intent);
                        SignUp.this.finish();
                    }
                }


                else
                {
                    Toast.makeText(SignUp.this, "Incorrect Email or Password....Try Again", Toast.LENGTH_LONG).show();
                }
//                else
//                {
//                    Toast.makeText(SignUp.this,"Success: "+s,Toast.LENGTH_LONG).show();
//                }

            }
            catch(JSONException e)
            {
                e.printStackTrace();
                Toast.makeText(SignUp.this,"Plz Try Again",Toast.LENGTH_LONG).show();
            }

            super.onPostExecute(result);

        }

    }
}

这是我的 LogCat:

10-11 17:48:49.118 10468-10468/com.encodezero.projectred E/WindowManager: android.view.WindowLeaked: Activity com.encodezero.projectred.SignUp has leaked window com.android.internal.policy.PhoneWindow$DecorView{75b57f9 V.E...... R......D 0,0-684,232} that was originally added here
                                                                              at android.view.ViewRootImpl.<init>(ViewRootImpl.java:375)
                                                                              at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
                                                                              at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                              at android.app.Dialog.show(Dialog.java:319)
                                                                              at com.encodezero.projectred.SignUp$Data.onPreExecute(SignUp.java:208)
                                                                              at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604)
                                                                              at android.os.AsyncTask.execute(AsyncTask.java:551)
                                                                              at com.encodezero.projectred.SignUp$2.onClick(SignUp.java:114)
                                                                              at android.view.View.performClick(View.java:5207)
                                                                              at android.view.View$PerformClick.run(View.java:21168)
                                                                              at android.os.Handler.handleCallback(Handler.java:746)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

【问题讨论】:

标签: java android json memory-leaks android-asynctask


【解决方案1】:

您的问题与 JSON 无关。

问题是您在Activity 中定义了AsyncTask 类(使其成为内部类)。这样做的问题是,只要AsyncTask 存在,来自ActivityContext 就会被泄露。 AsyncTask 包含对其父级的隐式引用。

您可以获取更多信息from this Youtube video。来自 Android 开发者 Youtube 频道。顺便说一句,观看他们所有的视频。

Activity 中取出您的AsyncTask,并在自己的文件中定义它。

【讨论】:

  • 你可以使用 Wea​​kReference 来保存你的上下文
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多