【问题标题】:Android onDestroy and finishAndroid onDestroy 并完成
【发布时间】:2016-05-04 13:09:26
【问题描述】:

我找到了一些关于 onDestroy 和 finish 之间区别的答案。

Finish 将从堆栈中删除活动,但不会释放 内存并且不会每次都调用 onDestroy。 onDestroy 将终止活动并释放内存。

在我的情况下: 有2个活动。 A 是主要活动,B 是带有一些 EditText 的活动,用于使用 Volley 将数据发送到服务器。

A -> B -> A

当我成功发送数据时,它会运行finish()来杀死B。 B被破坏。但我再次调用 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);
    }

更新

Activity B 通过使用 FragmentStatePagerAdapter 拥有 viewpager 和 3 个片段。 当我调用 B 的 finish() 时,片段下的那些数据不会清除。当我再次启动 B 活动时,我可以看到旧数据。

【问题讨论】:

  • 你怎么叫更新?
  • 我将 update() 放入帮助类,当我按下按钮时将 B 传递给 update()。所以我在发送数据后调用 B.finish()

标签: android ondestroy


【解决方案1】:

当你调用下面的函数时:

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

需要注意的是,它的所有资源都排队等待垃圾回收,并且该活动使用的所有内存都将在下一个GC周期期间被释放。 p>

如果您真的想尽快撤销内存,请覆盖您的活动的 onDestroy 方法:

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

关于 Runtime.getRuntime().gc(); 的注意事项要求 VM 尽最大努力回收所有丢弃的对象——引自 http://www.tutorialspoint.com/java/lang/runtime_gc.htm

【讨论】:

  • 这是一些很棒的信息!
  • 这大错特错。 gc() 方法只是垃圾收集的一个提示。你不要强迫这个。我想说这只不过是一种代码味道,你应该不惜一切代价避免。
  • 我认为您的建议有效。然而,我发现我的情况很特别,有一些片段。
  • @waikwanChiu,如果有帮助请标记为答案。
  • 好的,感谢您的帮助。给我一点时间。我需要找到解决我的案子的解决方案。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多