2016-05-04 7 views
0

Я нашел некоторый ответ о различии между onDestroy и финишем.Android onDestroy и финиш

Finish удалит активность из стека, но не освободит память и не будет вызывать OnDestroy каждый раз. onDestroy убьет активность и освободит память.

В моей ситуации: Имеются 2 вида деятельности. A - основное действие, а B - это действие с некоторым EditText для отправки данных на сервер с помощью Volley.

А -> В -> A

Когда я послал successfully.It данные будут запускать отделку(), чтобы убить Б. Б разрушается. Но я снова вызываю B, все данные все еще там (содержимое EditText). Это означает, что память не понятна.

Кто-нибудь сталкивался с этими проблемами? Есть мой код:

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

ОБНОВЛЕНО

активность B имеют ViewPager и 3 фрагмента с помощью FragmentStatePagerAdapter. Когда я нахожу финиш() B. Эти данные под фрагментами не будут очищены. Я могу видеть старые данные, когда снова запускаю активность B.

+0

Как вы можете позвонить? – varunkr

+0

Я поместил update() в класс справки, передал B в update(), когда я нажимаю кнопку. Поэтому я вызываю B.finish() после отправки данных –

ответ

4

При вызове ниже функции:

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

Следует отметить, что все его ресурсы очередь для сбора мусора, и вся память, которая была использована при этой деятельности будет освобожден в течение следующего GC цикла.

Если вы действительно хотите, чтобы отменить память как можно скорее, переопределить метод OnDestroy вашей деятельности:

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

Примечание о Runtime.getRuntime() дс();. это просит VM приложить все усилия для утилизации всех отброшенных объектов - цитируется с http://www.tutorialspoint.com/java/lang/runtime_gc.htm.

+0

Это отличная информация! – varunkr

+0

Это очень неправильно. Метод gc() является лишь подсказкой для коллекции мусора. Вы ничего не заставляете с этим. Я бы сказал, что это ничего, кроме запаха кода, которого вы должны избегать любой ценой. –

+0

Хорошо. Обновлено. – David

Смежные вопросы