安卓开发学习---kotlin版---笔记(三)

news2024/9/29 7:28:51

网络

安卓主页的网络框架:OkHttp
在OkHttp的基础上进行封装的:Retrofit框架,更常使用

OkHttp学习

在使用网络请求的时候,先添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />

类似还有其他:

    <!--网络权限-->
    <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" />

除此之外,还有添加两个依赖:
app-build.gradle-dependencies下:

implementation("com.squareup.okhttp3:okhttp:4.9.0")
// 网络请求日志打印
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")

在高版本下,需要满足HTTPS的要求,如果你调试使用的是HTTP的接口,要加上:
android:usesCleartextTraffic="true"

没有请求的接口?

这个网站可以模拟接口请求:点我
或者
使用 天气预报

Get请求

同步请求
	private val BaseUrl = "http://www.tianqiapi.com"

    val client = OkHttpClient.Builder()//build构造者设计模式
        .connectTimeout(10, TimeUnit.SECONDS)//链接超时时间
        .readTimeout(10, TimeUnit.SECONDS)//读取超时时间
        .writeTimeout(10, TimeUnit.SECONDS)//写超时时间,也就是请求超时
        .build()

    //get方法
    fun get(url: String){
        //创建一个子线程
        Thread(Runnable {
            val string2 = BaseUrl + url
            println("string2 = ${string2}")
            val request: Request = Request.Builder()//build构造者设计模式
                .url(string2)//请求地址
                .build()
            //client对象 与 request产生关联,返回一个Call对象
            val call: Call = client.newCall(request)
            //执行,返回一个Response对象(execute()是同步请求)
            val response: Response = call.execute()
            //获取body
            val body:String? = response.body?.string()


            //结果打印
            Log.e("OKHTTP", "get response body = ${body}")
            println("get response body = ${body}")
        }).start()
    }
异步请求
	///异步get请求
    fun getAsync(url: String){
        val string2 = BaseUrl + url
        println("string2 = ${string2}")
        val request: Request = Request.Builder()//build构造者设计模式
            .url(string2)//请求地址
            .build()
        //client对象 与 request产生关联,返回一个Call对象
        val call: Call = client.newCall(request)
        //执行,返回一个Response对象(enqueue()是异步请求)
        val response: Unit = call.enqueue(object :Callback{
            override fun onFailure(call: Call, e: IOException) {
                Log.e("OKHTTP", "get response body = ${e.message}")
                println("error = ${e.message}")
            }

            override fun onResponse(call: Call, response: Response) {
                //获取body
                val body:String? = response.body?.string()
                //结果打印
                Log.e("OKHTTP", "get response body = ${body}")
                println("get response body = ${body}")
            }
        })
    }

Post请求

同步请求

	//post方法
    fun post(url: String){
        //创建一个子线程
        Thread(Runnable {
            //创建body
            val body2 = FormBody.Builder()
                .add("key", "value")//添加参数
                .add("key2", "value2")
                .build()

            val string2 = BaseUrl + url
            println("string2 = ${string2}")
            val request: Request = Request.Builder()//build构造者设计模式
                .url(string2)//请求地址
                .post(body2)//接口参数
                .build()
            //client对象 与 request产生关联,返回一个Call对象
            val call: Call = client.newCall(request)
            //执行,返回一个Response对象(execute()是同步请求)
            val response: Response = call.execute()
            //获取body
            val body:String? = response.body?.string()
            //结果打印
            Log.e("OKHTTP", "get response body = ${body}")
            println("get response body = ${body}")
        }).start()
    } 

异步请求

	//post异步方法
    fun postAsync(url: String){
        //创建body
        val body2 = FormBody.Builder()
            .add("key", "value")//添加参数
            .add("key2", "value2")
            .build()

        val string2 = BaseUrl + url
        println("string2 = ${string2}")
        val request: Request = Request.Builder()//build构造者设计模式
            .url(string2)//请求地址
            .post(body2)//接口参数
            .build()
        //client对象 与 request产生关联,返回一个Call对象
        val call: Call = client.newCall(request)
        //执行,返回一个Response对象(enqueue()是同步请求)
        val response: Unit = call.enqueue(object :Callback{
            override fun onFailure(call: Call, e: IOException) {
                TODO("Not yet implemented")
            }
            override fun onResponse(call: Call, response: Response) {
                //获取body
                val body:String? = response.body?.string()
                //结果打印
                Log.e("OKHTTP", "get response body = ${body}")
                println("get response body = ${body}")
            }
        })
    }

拦截器

LoggingInterceptor

//继承Interceptor
class LoggingInterceptor : Interceptor{
    //重写方法
    override fun intercept(chain: Interceptor.Chain): Response {
        //获取当前请求的时间戳
        val time_start = System.nanoTime()
        //获取请求对象
        var request = chain.request()
        //获取响应对象
        var response = chain.proceed(request)

        //获取body
        var buffer = okio.Buffer()
        request.body?.writeTo(buffer)

        var requestBodyString = buffer.readUtf8()
        //打印
        Log.e("OKHTTP", String.format("request: %s, params: %s", request.url, requestBodyString))

        val businessData: String = response.body?.string() ?: "空"
        Log.e("OKHTTP", businessData);

        //此处需要创建新的response并返回,非直接返回
        return response
    }

}

GSON解析

首先,添加依赖:
implementation 'com.google.code.gson:gson:2.8.6'

JSON转model
import com.google.gson.Gson

fun main(){
    //json串
    val json ="{\"uid\":\"00001\",\"userName\":\"Freeman\",\"telNumber\":\"13000000000\"}";
    
    //创建一个gson对象
    var gson = Gson()
    //json转model
    val account = gson.fromJson<Account>(json, Account::class.java);

    //打印某一个账号的名字
    println(account.userName)
    //打印所有属性
    println(account.toString())
    
}


class Account{
    var uid: String = "001"
    var userName: String = "jack"
    var password: String = "123456"
    var telNumber: String = "130000000"
    override fun toString(): String {
        return "Account(uid='$uid', userName='$userName', password='$password', telNumber='$telNumber')"
    }
}
model转JSON
//model转Json
println("model转Json ${gson.toJson(account)}")

JsonToKotlin插件:可以将json转化为模型定义属性


Fragment

fragment不能单独使用,要嵌在activity里面
fragment的生命周期,受宿主(activity)的生命周期的影响

fragment的生命周期:
在这里插入图片描述

//Activity
class FragmentStudyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fragment_study)

        //创建fragment对象
        val fragment = FragmentStudy()
        //传递数据
        //创建一个bundle
        val bundle = Bundle()
        bundle.putInt("key1", 22)
        bundle.putString("key2", "wwwwwwww")
        //赋值
        fragment.arguments = bundle

        //并联关系
        val beginTransaction = supportFragmentManager.beginTransaction()
        //将某个layout的id拿到,添加到fragment上
        beginTransaction.add(R.id.container, fragment)
        //添加到事务里面
        beginTransaction.commitAllowingStateLoss()
    }
}

//Fragment
class FragmentStudy :Fragment(){
    var key1 = 2
    var key2 = "qqqqq"

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

//        return inflater.inflate(R.layout.activity_third, container, false)

        //创建一个textView
        val textView = TextView(context)
        textView.text = key2
        textView.setTextSize(22F)
        textView.gravity = Gravity.CENTER
        return textView
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        key1 = arguments?.getInt("key1") ?: 3
        key2 = arguments?.getString("key2") ?: "pppp"

        println("key1 = ${key1}")
        println("key2 = ${key2}")

        //该view,就是上面创建的TextView
        val textView = view as TextView
        textView.text = key2
    }

}

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

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

相关文章

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

数据库——水果商店进阶

智能2112杨阳 一、目的与要求&#xff1a; 综合运用SQL语言相关知识如变量、游标、函数、触发器等解决实际问题。 二、内容&#xff1a; 设计并完成以下实验&#xff0c;要求附上源码&#xff08;非截图&#xff09;&#xff0c;测试效果截图 在订单详情表orderitems插入新…

【openGauss/MogDB列存表的delta表测试】

列存储格式是OLAP类数据库系统最常用的数据格式&#xff0c;适合复杂查询、范围统计类查询的在线分析型处理系统。cstore列存储的主体数据文件以CU为I/O单元&#xff0c;只支持追加写操作&#xff0c;因此cstore只有读共享缓冲区。CU间和CU内的可见性由对应的CUDESE表&#xff…

高项-【整合管理】

8.1管理基础 项目整合管理由项目经理负责&#xff0c;责任不能被授权和转移。对整个项目承担最终责任。执行项目整合是担任双重角色&#xff1a; 组织层面&#xff0c;与项目发起人携手合作&#xff0c;了解战略目标&#xff0c;确保项目目标和成果与项目组合、项目集一集业务…

自助借还办证一体机软件需求说明书

1. 简介 1.1 项目概括 本项目主要实现读者自助办证、借书、还书、查询、续借的功能&#xff0c;减轻管理员的工作量&#xff0c;提升读者的借阅体验&#xff0c;提高了图书的借阅量与流通率&#xff0c;是图书馆智能化、无人化建设的重要步骤。 1.2 项目背景 ​ 目前各大图…

【ArkTS】如何修改应用的首页

之前看到一种说法&#xff0c;说是应用首页是 entry > src > main > resources > base > profile > main_pages.json 中src配置中数组第一个路径元素。这种说法是不对的&#xff01;&#xff01;&#xff01; 如果需要修改应用加载时的首页&#xff0c;需要…

软件测试面试题之测试基础,轻松面对面试,一篇足矣

软件测试的流程是什么&#xff1f;&#xff08;测试流程&#xff09; &#xff08;1&#xff09;需求调查&#xff1a;全面了解系统概况、应用领域、软件开发周期、软件开发环境、开发组织、时间安排、功能需求、性能需求、质量需求及测试要求等。根据系统概况进行项目所需的人…

oracle与gbase8s迁移数据类型对照

声明&#xff1a;以下为笔者阅读gbase官方文档和oracle官方文档的理解&#xff0c;如有错误&#xff0c;敬请指正。oracle与gbase8s迁移数据类型对照及举例说明 最终结论&#xff1a;oracle与gbase8s数据类型对应关系关于单精度与双精度的区别关于定点与浮点定义的区别精度的定…

linux之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

Bezier 曲线 2D

Bezier 曲线于 1962 年由法国雪铁龙汽车公司的工程师 Bezier 所发表&#xff0c;主要应用于汽车的外形设计。虽然 Bezier 曲线早在 1959 年便由法国雷诺汽车公司的 De Casteljau 运用递推算法开发成功&#xff0c;但是 Bezier 却给出了曲线的详细的曲线计算公式。所以&#xff…

游戏、算法竞赛与退役(流水账版)

写在前面 不出意外的话&#xff0c;这东西本该咕到翻年之后再发的&#xff0c;但好像催稿催的有点厉害&#xff0c;于是就找个机会把他写了&#xff08;笑&#xff09; 最初是只想写个算法竞赛退役记的&#xff0c;后面发觉写起来就有点收不住&#xff0c;算法竞赛牵扯到太多…

linux网络管理_配置网络参数

11.2 配置网络参数 ls /etc/sysconfig/network-scripts/ 11.2.1 配置IP 配置网卡参数 # 可考虑先备份 # cp /etc/sysconfig/network-scripts/ifcfg-ens33 . # 复制到当前目录 ​ vim /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33文件中的内容 TYPEEthernet PROX…

MATLAB 平面拟合并可视化(34)

MATLAB 平面拟合并可视化(34) 一、效果二、代码一、效果 二、代码 % 生成三维点数据 x = rand(100, 1); y = rand(100, 1

LLaMA系列模型

1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月&#xff0c;Meta&#xff08;原Facebook&#xff09;推出了LLaMA大模型&#xff0c;使用了1.4T token进行训练&#xff0c;虽然最大模型只有65B&#xff0c;但在相关评…

Python实战:信用卡客户历史数据挖掘与分析

Python实战&#xff1a;信用卡客户历史数据挖掘与分析 引言数据获取与预处理描述性分析模型建立与评估结果分析Web应用展示&#xff08;可选&#xff09; 引言 信用卡客户历史数据分析是金融领域中的重要课题之一。通过对公开数据集的挖掘&#xff0c;本文将利用Python编程语言…

51单片机LED与无源蜂鸣器模块

IO口的使用1 本文主要对51单片机的LED灯的使用以及蜂鸣器的使用进行介绍&#xff0c;其中包括一些实例分析&#xff1a; 1.实现发光二极管的从左到右的流水点亮 2.左右来回循环的流水灯 3.蜂鸣器以一定频率响 文章目录 IO口的使用1一、LED灯举个栗子一举个栗子二 二、蜂鸣器2.1…

华为OD机试 - 连续出牌数量 - 深度优先搜索dfs算法(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路1、题目解读2、具体步骤 五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08…

Linux--学习记录(3)

G重要编译参数 -g&#xff08;GDB调试&#xff09; -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息&#xff0c;以调试程序编译带调试信息的可执行文件g -g hello.c -o hello编译过程&#xff1a; -E&#xff08;预处理&#xff09; g -E hello.c -o hello.i-S&#xff08;编…

基于springboot+vue 的智能物流管理系统

简介 基于springbootvue 的智能物流管理系统 适用于 设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料 **项目编号&#xff1a;springboot074 ** **…