IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 安卓发起HTTP请求 -> 正文阅读

[网络协议]安卓发起HTTP请求

HTTPURLConnection

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(v->{
            getHTTPRes();
        });

    }
    private void getHTTPRes(){
        new Thread(()->{
            HttpURLConnection connection=null;
            try {
                URL url=new URL("https://cn.bing.com/");
                connection= (HttpURLConnection) url.openConnection();
                //设置连接的请求方法和延迟时限
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);

                //获取输入流
                InputStream inputStream = connection.getInputStream();
                
                //繁琐的IO操作
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                StringBuilder builder=new StringBuilder();
                while((line=reader.readLine())!=null){
                   builder.append(line);
                    Log.d("mes", "getHTTPRes: "+line);
                }
                
                updateUI(builder.toString());

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                connection.disconnect();
            }
        }).start();
    }
    private void updateUI(String str){
        //这是activity中的方法
        runOnUiThread(()->{
            TextView textView = (TextView) findViewById(R.id.text);
            textView.setText(str);
        });

    }
}

这里遇到一个问题,每次重新运行程序只是在虚拟机中重新编译了app,如果要改变权限需要卸载了重新下载一遍。

OKHTTP

采用OKHTTP可以实现避免繁琐恼人的IO操作,不过这个库最好用kotlin写,因为调用的方法符合kotlin的规范,可能会让写多了Java的人感到困惑。

private void getHTTPResWithOkhttp() {
        new Thread(() -> {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url("https://cn.bing.com/").build();

            try {
                Response response = client.newCall(request).execute();
                updateUI(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }).start();
    }

HTTP请求工具类

可以发现请求并获取HTTP报文的步骤是可以作为一个模块分离的,因此编写请求工具类,需要注意的是安卓的网络访问请求必须放在子线程中进行,子线程中无法返回值,因此不能单独在工具类的方法中开启子线程返回所需报文,可以采用回调接口的方式来实现子线程请求。

interface HTTPCallBack{
    public void onFinish(String res);
    public String onError(String res);
}
class HTTPRequest{
    public static void getRequest(String uri,HTTPCallBack callBack){
        new Thread(()->{
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(uri).build();
            try {
                Response response= client.newCall(request).execute();
                callBack.onFinish(response.body().string());
            } catch (IOException e) {
                callBack.onError(e.toString());
            }

        }).start();
    }
}
HTTPRequest.getRequest("https://cn.bing.com/", new HTTPCallBack() {
                @Override
                public void onFinish(String res) {
                    updateUI(res);
                }

                @Override
                public String onError(String res) {
                    return null;
                }
            });

不过在OkHttp里面 ,提供了开好子线程的请求方法enqueue,这样就没必要自己开启子线程了。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:17:36  更:2021-10-22 11:18:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 12:21:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码