2016-05-04 21 views
0

Ich fand eine Antwort über den Unterschied zwischen onDestroy und zu beenden.Android onDestroy und beenden

Finish wird die Aktivität aus dem Stapel entfernen, aber Speicher nicht freigeben und onDestroy nicht jedes Mal aufrufen. onDestroy wird die Aktivität beenden und den Speicher freigeben.

In meiner Situation: Es gibt 2 Aktivitäten. A ist Hauptaktivität und B ist eine Aktivität mit einigen EditText zum Senden von Daten an den Server mit Volley.

A -> B -> A

Wenn ich die Daten successfully.It geschickt, um die finish() laufen zu töten B. B zerstört wird. Aber ich rufe B noch einmal an, alle Daten noch da (Inhalt von EditText). Was bedeutet, dass die Erinnerung nicht klar ist.

Hat sich jemand auf diese Frage gestellt? Es gibt meinen Code:

public void update(final Context context, final Map<String,String> data,final Activity activity){//pass B 
     RequestQueue queue = Volley.newRequestQueue(context); 
     String url = "http://xxxxxxxx"; 
     StringRequest sr = new StringRequest(Request.Method.POST,url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       activity.finish(); 



      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       //mPostCommentResponse.requestEndedWithError(error); 
      } 
     }){ 
      @Override 
      protected Map<String,String> getParams(){ 
       Map<String,String> params = data; 
       //data. 
       //params.put("user",data.get('')); 


       return params; 
      } 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       Map<String,String> params = new HashMap<String, String>(); 
       params.put("Content-Type","application/x-www-form-urlencoded"); 
       return params; 
      } 
     }; 
     queue.add(sr); 
    } 

AKTUALISIERT

Aktivität B haben viewpager und 3-Fragment von FragmentStatePagerAdapter verwenden. Wenn ich finish() von B anrufe. Diese Daten unter den Fragmenten werden nicht gelöscht. Ich kann die alten Daten sehen, wenn ich wieder B-Aktivität starte.

+0

Wie rufen Sie update? – varunkr

+0

Ich lege update() in die Hilfe-Klasse, pass B in update(), wenn ich den Knopf drücke. Also rufe ich B.finish() an, nachdem ich die Daten gesendet habe –

Antwort

4

Wenn Sie unten Funktion aufrufen:

someActivity.finish(); // This will free the memory, see notes below 

Es sollte beachtet werden, dass alle seine Ressourcen sind für die Garbage Collection Warteschlange, und alle Speicher, die von dieser Aktivität verwendet wurde, wird während nächsten GC-Zyklus freigegeben werden.

Wenn Sie wirklich wollen den Speicher so schnell wie möglich zu widerrufen, außer Kraft setzen Ihre Aktivitäten onDestroy Methode:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Runtime.getRuntime().gc();  // notify gc to be called asap 
} 

Hinweis über Runtime.getRuntime() gc();. Dies fordert die VM auf, alle verworfenen Objekte zu recyceln - zitiert aus http://www.tutorialspoint.com/java/lang/runtime_gc.htm.

+0

Das sind einige gute Infos !! – varunkr

+0

Das ist ziemlich falsch. Die Methode gc() ist lediglich ein Hinweis auf die Garbage Collection. Sie erzwingen damit nichts. Ich würde sagen, das ist nichts als ein Code-Geruch, den Sie um jeden Preis vermeiden sollten. –

+0

In Ordnung. Aktualisiert. – David

Verwandte Themen