有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSON对象泄漏窗口

我得到一个名为“user”的json对象,它包含两个字段,name和email。 我想将这两个值显示为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);

        }

    }
}

这是我的日志:

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

共 (1) 个答案

  1. # 1 楼答案

    你的问题与JSON无关

    问题是您已经在Activity中定义了AsyncTask类(使其成为一个内部类)。问题是,只要AsyncTask存在,你的Contextfrom Activity就会被泄露。AsyncTask包含对其父级的隐式引用

    你可以获得更多信息。来自Android开发者Youtube频道。顺便说一句,看看他们所有的视频

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