这是我在面试的时候,别人问的,其实 ,在实际开发中,并没有怎么遇到:
如果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直接实现了回接口。而同样的,也没有异常报出。
我目前粗浅地理解:
内部类会持有整个外部类的引用,所以,即使在手机上,页面虽然已经关闭了,但其实 ,这些资源还是没有释放的,所以,设置起来还是异常的。而网络请求,因为是异步的,肯定还是会走完的。
而继承这个,也是同样的,网络请求持有这个回调的实例,一直没有释放,所以,内存是没有办法回收的。
希望大神给一个解释。