0

I am getting a json object named "user" and it contains two fields, name and email. I want to display these two values as toast but the LogCat is showing window leak error.

This is my AsyncTask class code:

 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);

        }

    }
}

This is my 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)
  • it is not related to your problem, but I would advise you to use retrofit for http requests https://zeroturnaround.com/rebellabs/getting-started-with-retrofit-2/ – Hank Moody Oct 11 '16 at 12:27
  • possible duplicate of : http://stackoverflow.com/questions/11957409/activity-has-leaked-window-com-android-internal-policy-impl-phonewindowdecorvie – M.Waqas Pervez Oct 11 '16 at 12:28

1 Answers1

0

Your problem is nothing to do with JSON.

The issue is that you have defined your AsyncTask class in an Activity (making it an inner class). The problem with this is that as long as the AsyncTask exists your Context from Activity will be leaked. The AsyncTask contains an implicit reference to its parent.

You can get more information from this Youtube video. From the Android Developers Youtube channel. Incidentally, watch all of their videos.

Take your AsyncTask out of the Activity and define it in its own file.

Knossos
  • 15,802
  • 10
  • 54
  • 91