0
点赞
收藏
分享

微信扫一扫

HttpURLConnection封装

秀妮_5519 2022-04-04 阅读 54

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);

举报

相关推荐

0 条评论