1. 程式人生 > >android中網路請求中頁面關閉了會怎麼樣

android中網路請求中頁面關閉了會怎麼樣

這是我在面試的時候,別人問的,其實 ,在實際開發中,並沒有怎麼遇到:

如果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直接實現了回介面。而同樣的,也沒有異常報出。

我目前粗淺地理解:

內部類會持有整個外部類的引用,所以,即使在手機上,頁面雖然已經關閉了,但其實 ,這些資源還是沒有釋放的,所以,設定起來還是異常的。而網路請求,因為是非同步的,肯定還是會走完的。

而繼承這個,也是同樣的,網路請求持有這個回撥的例項,一直沒有釋放,所以,記憶體是沒有辦法回收的。

希望大神給一個解釋。