这里涉及到两个问题:首先是网络连接的代码比较长,所以可以把它封装在一个类里面,然后设置一个静态的方法,每次要进行网络连接的时候调用它就可以了;还有一个问题是由于网络连接需要开启子线程,然而子线程又不能返回数据,所以需要设置回调函数。
这里首先创建一个接口,意思就是回调函数:
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。