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