android中網路請求中頁面關閉了會怎麼樣
阿新 • • 發佈:2019-02-03
這是我在面試的時候,別人問的,其實 ,在實際開發中,並沒有怎麼遇到:
如果activity中開啟了一個網路請求,正在請求中的時候,activity關閉了,那網路請求會怎麼樣?
因為之前沒有遇到過這個問題,我當時想的是,網路請求是非同步的,應該還會繼續,資料返回以後,比如要往一個textview上繫結資料,那textview因為頁面destory,可能會為空,所以報空指標。
後來,我專門自己做了一下實驗,發現不是這樣的:
這是我的實驗程式碼,在activity中,作了一次網路請求,可以看到,使用了匿名內部類,同時關閉了activity,我的手機使用了2G網路,可以保證,在activity結束的時候,網路請求結果還沒有返回。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(); } }
結果:
沒有任何異常報出。
第二個測試:
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直接實現了回介面。而同樣的,也沒有異常報出。
我目前粗淺地理解:
內部類會持有整個外部類的引用,所以,即使在手機上,頁面雖然已經關閉了,但其實 ,這些資源還是沒有釋放的,所以,設定起來還是異常的。而網路請求,因為是非同步的,肯定還是會走完的。
而繼承這個,也是同樣的,網路請求持有這個回撥的例項,一直沒有釋放,所以,記憶體是沒有辦法回收的。
希望大神給一個解釋。