2016-10-11 1 views
0

Ich bekomme ein JSON-Objekt namens "Benutzer" und es enthält zwei Felder, Name und E-Mail. Ich möchte diese beiden Werte als Toast anzeigen, aber der LogCat zeigt einen Fensterleckfehler an.JSON Objekt leckt Fenster

Das ist mein AsyncTask Klassencode:

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

     } 

    } 
} 

Das ist mein 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) 
+0

ist es nicht zu Ihrem Problem zu tun, aber ich würde Ihnen raten, Retrofit zu verwenden, um http https://zeroturnaround.com/rebellabs/getting-started-with-retrofit-2/ –

+0

möglich Duplikat Anfragen: http: //stackoverflow.com/questions/11957409/activity-has-leaked-window-com-android-internal-policy-impl-phonewindowdecorvie –

Antwort

0

Ihr Problem ist, nichts mit JSON zu tun. Das Problem ist, dass Sie Ihre AsyncTask Klasse in einem Activity definiert haben (was es zu einer inneren Klasse macht) Das Problem damit ist, dass, solange die AsyncTask existiert Ihre Context von Activity wird durchgesickert. Das AsyncTask enthält eine implizite Referenz auf seinem übergeordneten Element.

Sie können weitere Informationen erhalten from this Youtube video. Vom Android-Entwickler-Youtube-Kanal. Sieh dir übrigens alle ihre Videos an.

Nehmen Sie Ihre AsyncTask aus der Activity und definieren Sie sie in einer eigenen Datei.

+0

Und Sie können WeakReference verwenden, um Ihren Kontext zu halten –