第一行代碼-10.5 網絡編程的最佳實踐

  這裏涉及到兩個問題:首先是網絡連接的代碼比較長,所以可以把它封裝在一個類裏面,然後設置一個靜態的方法,每次要進行網絡連接的時候調用它就可以了;還有一個問題是由於網絡連接需要開啓子線程,然而子線程又不能返回數據,所以需要設置回調函數。
  這裏首先創建一個接口,意思就是回調函數:

public interface HttpCallbackListener {

    void finish(String response);

    void onError(Exception e);

}

  然後定義HttpUtil,作爲網絡連接的通用類。

public class HttpUtil {

    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    InputStream in = connection.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(in));
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
                    listener.finish(sb.toString());
                }
                catch (Exception e) {
                    e.printStackTrace();
                    listener.onError(e);
                }
                finally {
                    if (connection != null) connection.disconnect();
                }
            }
        }).start();
    }
}

  這裏就是發送請求然後接收返回的數據的代碼,增加的地方就是調用接口的函數。然後我們在MainActivity裏調用它,注意接口都是要先實例化之後纔可以調用。

private void sendHttpRequestWithHttpUtil() {
    String address = "http://www.baidu.com";
    HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {

        @Override
        public void onError(Exception e) {
            Log.d("MainActivity", "連接失敗");
        }

        @Override
        public void finish(String response) {
            Message msg = new Message();
            msg.obj = response;
            handler.sendMessage(msg);
        }
    });
}

  需要注意的地方是接口中的代碼依然是在子線程中執行的,所以也不能直接修改UI。

發佈了79 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章