android中网络请求中页面关闭了会怎么样

当Android Activity在进行网络请求时被关闭,通常情况下不会出现异常。网络请求会继续完成,但由于Activity已销毁,数据无法绑定到UI,避免空指针。内部类持有可能导致资源未释放,网络请求完成后回调仍会执行,可能引发内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我在面试的时候,别人问的,其实 ,在实际开发中,并没有怎么遇到:

如果activity中开启了一个网络请求,正在请求中的时候,activity关闭了,那网络请求会怎么样?

因为之前没有遇到过这个问题,我当时想的是,网络请求是异步的,应该还会继续,数据返回以后,比如要往一个textview上绑定数据,那textview因为页面destory,可能会为空,所以报空指针。

后来,我专门自己做了一下实验,发现不是这样的:

public class TestZipActivity extends Activity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        textView = (TextView) findViewById(R.id.text);
        AsyncHttpClient httpClient = new AsyncHttpClient();
        RequestHandle requestHandle = httpClient.get("https://www.baidu.com/", new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
                System.out.println(responseString);
                textView.setText(responseString);
            }
        });
        this.finish();
    }

}
这是我的实验代码,在activity中,作了一次网络请求,可以看到,使用了匿名内部类,同时关闭了activity,我的手机使用了2G网络,可以保证,在activity结束的时候,网络请求结果还没有返回。

结果:

没有任何异常报出。


第二个测试:

public class TestZipActivity extends Activity implements Response.Listener, Response.ErrorListener {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        textView = (TextView) findViewById(R.id.text);
        AsyncHttpClient httpClient = new AsyncHttpClient();

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest("https://www.baidu.com/", this, this);
        requestQueue.add(stringRequest);
        this.finish();
    }

    @Override
    public void onErrorResponse(VolleyError error) {

    }

    @Override
    public void onResponse(Object response) {
        System.out.println(response);
        textView.setText((String) response);
    }
}

这个测试可以很清楚地看到,activity直接实现了回接口。而同样的,也没有异常报出。


我目前粗浅地理解:

内部类会持有整个外部类的引用,所以,即使在手机上,页面虽然已经关闭了,但其实 ,这些资源还是没有释放的,所以,设置起来还是异常的。而网络请求,因为是异步的,肯定还是会走完的。


而继承这个,也是同样的,网络请求持有这个回调的实例,一直没有释放,所以,内存是没有办法回收的。


希望大神给一个解释。



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值