JSON对象泄漏窗口



我得到一个名为"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)

你的问题与JSON无关。

问题是您已经在Activity中定义了AsyncTask类(使其成为内部类)。这个问题是,只要AsyncTask存在你的ContextActivity将泄露。AsyncTask包含了对父节点的隐式引用。

你可以从这个Youtube视频中获得更多信息。来自Android Developers Youtube频道。顺便说一下,看他们所有的视频。

AsyncTaskActivity中取出并在自己的文件中定义

最新更新