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

来源:互联网 发布:javascript prompt 编辑:程序博客网 时间:2024/04/29 22:09

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

如果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直接实现了回接口。而同样的,也没有异常报出。


我目前粗浅地理解:

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


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


希望大神给一个解释。



4 0