HttpURLConnection封装
思考:
解决办法:封装
方式一:
public class HttpUtil{
//通过sendHttpRequest() 发送HTTP请求
//返回数据类型为String
public static String sendHttpRequest(String address){
…….
…….
}
}
调用HttpUtil类的sendHttpRequest()方法
String address = “https://www.baidu.com” //服务器地址
String response = HttpUtil.sendHttpRequest(address);
此时又有新的问题:
解决办法:
在sendHttpRequest()方法内部开启一个线程?
不可行
方式二:
使用回调接口
定义一个回调接口,将它命名成为HttpCallBackListener
public interface HttpCallbackListener{
void onFinish(String response);//当服务器成功响应我们请求的时候调用。
void onError(Exception e);//当进行网络操作出现错误的时候调用。
}
修改HttpUtil:
public class HttpUtil{
public static String sendHttpRequest(final String address,final HttpCallbackListener listener)
{
new Thread(new Runnable(){
@Override
public void run(){
}
}).start();
}
}
run方法中可以使用HttpURLConnection进行网络请求
HttpURLConnection connection = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.connect();
int code = connection.getResponseCode();
if (code==connection.HTTP_OK){
InputStream in = connection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line=bf.readLine())!=null){
sb.append(line);
}
if (callBack!=null){
callBack.onFinish(sb.toString());
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(connection!=null) {
connection.disconnect();
}
}
修改后的调用语句:
//在onCreate()外
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Object obj = msg.obj;
ivPic.setImageBitmap((Bitmap) obj);
}
};
//onCreate()方法中
HttpUtil.sendHttpRequest(address , new HttpCallbackListener() {
@Override
public void onFinish(String response){
//接收并解析从服务器返回的数据
//这里需要进行UI线程的切换
//方法1:借助runOnUiThread()方法进行线程切换
/*runOnUiThread(new Runnable() {
@Override
public void run() {
......
}
});*/
//方法2:通过Handler对象传递消息给主线程。
Message message = new Message();
message.obj = bitmap;
handler.sendMessage(message);
}
@Override
public void onError(Exception e){
//对异常情况进行处理
}
});
注意:
方法1:借助runOnUiThread()方法进行线程切换。
runOnUiThread(new Runnable() {
@Override
public void run() {
......
}
});
方法2:通过Handler对象传递消息给主线程。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Object obj = msg.obj;
ivPic.setImageBitmap((Bitmap) obj);
}
};
Message message = new Message();
message.obj = bitmap;
handler.sendMessage(message);