《第一行代码》 第九章:使用网络技术

news2025/1/16 17:06:40

一,WebView的用法

活动布局的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后在活动页中修改代码:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView webView=(WebView) findViewById(R.id.web_view);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(
                new WebViewClient()
        );
        webView.loadUrl("https://www.baidu.com");
    }
}

menifest文件中增加权限控制

<uses-permission android:name="android.permission.INTERNET"/>

二,使用http协议访问网络

1,使用OkHttpClient

第一步:在app/build.gradle文件中引入库

    implementation 'com.squareup.okhttp3:okhttp:3.14.7'
    implementation 'com.squareup.okio:okio:1.17.5'

第二步:在menifest文件中申请网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第三步:布局修改

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/test_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </ScrollView>
</LinearLayout>

第四步:活动页中修改发起get请求

public class MainActivity extends AppCompatActivity {
    TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         responseText=(TextView) findViewById(R.id.test_text);
        //创建一个OkHttpClient实例
        OkHttpClient httpClient = new OkHttpClient();
        String url = "https://www.baidu.com/";
        //构建一个request对象
        Request getRequest = new Request.Builder()
                .url(url)
                .get()
                .build();
        //调用OkHttpClient创建一个Call对象
        Call call = httpClient.newCall(getRequest);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //同步请求,要放到子线程执行,调用它的execute方法发送请求
                    Response response = call.execute();
                   //将内容显示到桌面上
                    showResponse(response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private void showResponse(final String response){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                responseText.setText(response);
            }
        });
    }
}

2,如果是post请求的话,就需要是这样:

        //创建一个OkHttpClient实例
        OkHttpClient httpClient = new OkHttpClient();
        RequestBody requestBody=new FormBody.Builder()
                .add("username","admin")
                .add("password","123456")
                .build();
        Request request=new Request.Builder()
                .url("http://www.baidu.com")
                .post(requestBody)
                .build();
        //调用OkHttpClient创建一个Call对象
        Call call = httpClient.newCall(request);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //同步请求,要放到子线程执行,调用它的execute方法发送请求
                    Response response = call.execute();
                   //将内容显示到桌面上
                    showResponse(response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

三,解析XML格式文件

在网络上传输的数据通常是有两种格式XML和JSON.

1,数据从哪里来

我们可以搭建一个web服务器,然后在这个服务器上提供一段XML格式的数据。接着在我们的程序里面取访问这个服务器,再对得到的XML文本进行解析。
新建一个get_data.xml文件:

<apps>
    <app>
        <id>1</id>
        <name>Google maps</name>
        <version>1.0</version>
    </app>
    <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>Google Play</name>
        <version>2.3</version>
    </app>
</apps>

放置到nginx文件中(nginx下载使用参考:https://blog.csdn.net/weixin_42349568/article/details/129245335?spm=1001.2014.3001.5501):
在这里插入图片描述
然后浏览器访问即可得到这个:
在这里插入图片描述

2,Pull解析xml

public class MainActivity extends AppCompatActivity {
    TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        responseText=(TextView) findViewById(R.id.test_text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //创建一个OkHttpClient实例
                    OkHttpClient httpClient = new OkHttpClient();
                    Request request=new Request.Builder()
                            .url("http://172.20.10.8/get_data.xml")
                            .build();
                    //同步请求,要放到子线程执行,调用它的execute方法发送请求
                    Response response = httpClient.newCall(request).execute();
                    String responseData=response.body().string();
                    Log.d("TAG", responseData);
                    parseXMLWithPull(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private String parseXMLWithPull( String xmlData){
        StringBuilder stringBuilder = new StringBuilder();
        try {
            //创建工厂
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            //获取实例
            XmlPullParser xmlPullParser = factory.newPullParser();
            //向解析器添加xml数据
            xmlPullParser.setInput(new StringReader(xmlData));
            int eventType = xmlPullParser.getEventType();
            String id = "";
            String name = "";
            String version = "";
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                            stringBuilder.append("id:" + id + "  ");
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                            stringBuilder.append("name:" + name + "  ");
                        } else if("version".equals(nodeName)){
                            version = xmlPullParser.nextText();
                            stringBuilder.append("version:" + version + "  ");
                        }
                        break;
                    }
                    case XmlPullParser.END_TAG: {
                        stringBuilder.append("\n");
                        break;
                    }
                    default:
                }
                try {
                    eventType = xmlPullParser.next();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("result:\n" + stringBuilder.toString());
        return stringBuilder.toString();
    }
}

中间如果遇到了网络访问有问题的情况,可以参考这篇博客:https://blog.csdn.net/java558/article/details/111357872。
实现的效果:
在这里插入图片描述

四,解析JSON格式文件

1,创建json文件

[{"id":"5","version":"5.5","name":"clash of class"},
{"id":"6","version":"7.2","name":"clash of class"},
{"id":"7","version":"8.3","name":"clash of class"}]

2,使用GSON来解析json

第一步:引入依赖:

implementation 'com.google.code.gson:gson:2.7'

第二步:创建app类

public class App {
    private String id;
    private String name;
    private String version;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getVersion() {
        return version;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

第三步:实现解析

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //创建一个OkHttpClient实例
                    OkHttpClient httpClient = new OkHttpClient();
                    Request request=new Request.Builder()
                            .url("http://172.20.10.8/get_data.json")
                            .build();
                    //同步请求,要放到子线程执行,调用它的execute方法发送请求
                    Response response = httpClient.newCall(request).execute();
                    String responseData=response.body().string();
                    parseJSONWithGSON(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private void parseJSONWithGSON(String jsonData){
        Gson gson=new Gson();
        List<App> appList=gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getType());
        for (int i=0;i<appList.size();i++){
            App app=appList.get(i);
            String name = app.getName();

            Log.d("TAG", name);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九龙证券|消费电子遇冷后转向动力储能赛道,但毛利率仍弱于同行

近年来&#xff0c;新能源的热度居高不下&#xff0c;顶着赛道光环&#xff0c;2月17日证监会发表信息显现&#xff0c;广州明美新能源股份有限公司&#xff08;简称明美新能&#xff09;首发上市取得通过。公司方案挂牌深交所创业板&#xff0c;并方案募资4.50亿元&#xff0c…

【RocketMQ】RocketMQ 5.0版本任意时刻延迟消息的实现原理浅析

文章目录意外发现设计方案时间轮定时消息存储具体实现流程图流程步骤意外发现 无意间从官方的最新的客户端代码中看到下面的Example&#xff1a; 感兴趣的可以看看这个介绍&#xff1a;https://rocketmq.apache.org/docs/featureBehavior/02delaymessage 生产者&#xff1a;…

【ES】Elasticsearch之数据类型

文章目录1、Mapping1.1 Mapping的作用1.2 Dynamic Mapping1.3 字段控制参数1.3.1 index1.3.2 Index Options1.3.3 null_value1.3.4 copy_to2、数据类型2.1 核心数据类型2.1.1 字符串类型2.1.2 数字类型2.1.3 日期类型2.1.3.1 date2.1.3.2 date_nanos2.1.4 布尔类型2.1.5 二进制…

java中使用protobuf总结

基本没怎么接触过java编程&#xff0c;别的团队发过来一个用java编写的存储pb的文件&#xff0c;让拆分和解析&#xff0c;硬着头皮做一下&#xff0c;在此将步骤做个记录&#xff1a;下载安装protobufhttps://github.com/protocolbuffers/protobuf/tags?afterv3.6.1.2编译pro…

Python大数据培训班特色优势及工作方向

Python大数据培训班有多个大数据培训班类型&#xff0c;同时也包括训练营、学徒班、就业班等。 具体班型&#xff1a; 大数据挖掘与人工智能&#xff08;大数据分析&#xff09;学徒班、大数据应用开发学徒班 大数据挖掘与人工智能&#xff08;大数据分析&…

网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?

毫无疑问&#xff0c;网络安全是当下最具潜力的编程方向之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握网络安全看似是一件十分困难的事。至于一个月能不能学会网络安全&#xff0c;这个要看个人&#xff0c;对于时间管理不是很高的&#xff0c;肯…

DDOS攻击和CC攻击分别是什么?

CC攻击其实是DDOS攻击的一种。CC攻击的前身CC攻击的前身是一个名为Fatboy攻击程序&#xff0c;而之所以后来人们会成为CC&#xff0c;是因为DDOS攻击发展的初期阶段&#xff0c;绝大部分DDOS攻击都能被业界熟知的“黑洞”&#xff08;collapsar&#xff0c;一种安全防护产品&am…

生成和查看dump文件

在日常开发中&#xff0c;即使代码写得有多谨慎&#xff0c;免不了还是会发生各种意外的事件&#xff0c;比如服务器内存突然飙高&#xff0c;又或者发生内存溢出(OOM)。当发生这种情况时&#xff0c;我们怎么去排查&#xff0c;怎么去分析原因呢&#xff1f; 1. 什么是dump文…

云服务器迁移 (全网最省钱最详细攻略)

0x00 背景服务器续费比较贵&#xff0c;由于旧的云服务器用的时间比较长&#xff0c;上面部署的应用&#xff0c;环境复杂、数据多&#xff0c;在新的服务器部署比较麻烦&#xff0c;所以想到把服务器环境制作成镜像。新服务器的选择上&#xff0c;我这里选择的天翼云服务器&am…

IGKBoard(imx6ull)-PWM编程蜂鸣器编程控制

文章目录1- PWM介绍2- PWM使能&#xff08;1&#xff09;添加配置&#xff08;2&#xff09;export、unexport与npwm属性文件&#xff08;3&#xff09;duty_cycle、enable和period属性文件3- PWM测试编程&#xff08;1&#xff09;PWM8管脚连接&#xff08;2&#xff09;流程介…

京东JDBook笔记本怎么安装Win10系统使用?

京东JDBook笔记本怎么安装Win10系统使用&#xff1f;有用户使用的京东JDBook笔记本电脑系统是Win7系统的&#xff0c;最近想要去将系统升级到Win10来使用。那么如何将Win7的系统重装Win10呢&#xff1f;以下为大家带来详细的操作步骤图文教程。 准备工作&#xff1a; 1、U盘一个…

视频和视频帧:FFMPEG CPU解码API介绍

写在前面本文将介绍的如何用FFMPEG API做视频解码。视频解码&#xff0c;是将压缩后的视频&#xff08;压缩格式如H264&#xff09;通过对应解码算法还原为YUV视频流的过程&#xff1b;在计算机看来&#xff0c;首先输入一段01串&#xff08;压缩的视频&#xff09;&#xff0c…

用 @types 前缀的包是什么?有什么用?

前言 解决过 TypeScript 的项目大概都是从两个方向&#xff0c;Vue3 方向和 React Native 方向&#xff0c;而在 React Native 方向上我经常会遇到一个烦人的错误 Could not find a declaration file for module ‘juejin-type-study’. ‘d:/fe-project/nodejs/types-study/n…

看懂这篇文章-你就懂了信息安全的密码学

一、前言一个信息系统缺少不了信息安全模块&#xff0c;今天就带着大家全面了解并学习一下信息安全中的密码学知识&#xff0c;本文将会通过案例展示让你了解抽象的密码学知识&#xff0c;阅读本文你将会有如下收获&#xff1a; 熟悉现代密码学体系包含的主流密码技术 掌握Base…

SignalR 实时通讯

SignalR 实时通讯1.SignalR1.1.SignalR 简介1.2.SignalR 功能1.3.传输1.4.中心2.服务器2.1.配置中心2.2.上下文对象2.3.客户端对象2.4.创建2.5.中心功能实现4.客户端6.案例演示&#xff08;DotNet 客户端&#xff09;1.SignalR 1.1.SignalR 简介 SignalR 是一个开放源代码库&a…

内容感知、AI融合:让实景三维看山是山,看水是水

实景三维具备还原客观物理世界的优势性&#xff0c;但也正由于部分真实性的欠缺备受争议。这是因为传统的三维建模软件大多基于像元的匹配与计算的逻辑&#xff0c;对地物进行无差别的重建处理&#xff0c;最终生成的模型看起来扭曲怪异、残缺变形。常见的模型缺陷有&#xff1…

2022 OpenCV Spatial AI大赛前三名项目分享,开源、上手即用,优化了OAK智能双目相机的深度效果。

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

深圳居住证申领指南

打开广东政务服务网&#xff0c;在首页搜索【深圳经济特区居住证申领】在搜索结果中可以发现有如下链接&#xff0c;点击在线办理 会转到登陆界面&#xff0c;直接使用个人登录并用微信扫描登录 根据提示进行手机登录验证。 完成登录认证之后会自转到深圳经济特区居住证申领界…

二分查找由浅入深--算法--java

二分查找写在开头算法前提&#xff1a;算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求&#xff1a;求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了&#xff0c;我本以为还可以。但有时候…

Word处理控件Aspose.Words功能演示:使用 Java 比较 MS Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…