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

网络

安卓主页的网络框架: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
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2 组件传递数据

向子组件传递数据通过Props 1.创建子组件 详细步骤&#xff1a; 1.在components创建子组件 2.等父组件接受到参数后通过Props来接受父组件传递过来的数据 <template><div id"app"><h2>title:{{ title }}</h2><p>tips:{{ tips }}<…

【力扣】148.排序链表

148.排序链表 怎么说&#xff0c;这道题看上去挺简单的&#xff0c;但是要搞清楚的知识点那还真不少&#xff0c;刷题好痛苦&#xff0c;但是要刷&#xff01;嘿嘿~ 首先&#xff0c;要搞懂归并排序&#xff0c;然后是递归。这道题我刚开始想的是递归&#xff0c;但是题友说时…

2023/12/21作业

思维导图 代码 .text .global _start _start: 灯1 gpio时钟使能 [4]->1 0x5000A28 LDR R0,0x50000A28 指定寄存器地址 LDR R1,[R0]将寄存器取出放到R1 ORR R1,R1,#(0x1<<4)将第四位设置为1 STR R1,[R0]读取R0寄存器到R1 PE…

【开源软件】最好的开源软件-2023-第二名: Podman

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

vue3 在vite.config中无法使用import.meta.env.*的解决办法

第一种,优先使用第一种方法,其中参数mode就是自定义--mode的值,如果没写,就是production或development import { loadEnv } from vite export default ({ mode }) > {return defineConfig({plugins: [vue()],base:loadEnv(mode, process.cwd()).VITE_APP_NAME}) } 第二种 …

鸿蒙开发基本概念

1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…

◢Django md5加密与中间件middleware

utils文件夹是重新建立的&#xff08;与migrations同级&#xff09;&#xff0c;该文件夹下主要存放工具&#xff0c;就像static文件夹下只存放静态文件一样 加密 在utils文件夹下建立encrypt.py文件 from django.conf import settings import hashlib def md5(data_string)…

一个正则快速找到在ES中使用profile的时产生慢查询的分片

在es中使用profile分析慢查询的时候&#xff0c;往往因为分片过多&#xff0c;或者因为查询条件太复杂&#xff0c;分析的结果几十万行。在kibana上点半天&#xff0c;也找不到一个耗时长的分片。 kibana上可以通过正则来匹配。其实我们只需要匹配到耗时大于10秒的请求。 检索语…

yolo-nas无人机高空红外热数据小目标检测(教程+代码)

前言 YOLO-NAS是目前最新的YOLO目标检测模型。从一开始&#xff0c;它就在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比&#xff0c;预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标。但是我们如何在自定义数据集上训练 YOLO NAS&#xff1f; 这将是我…

多媒体信息化建设,动态数据中心,深入理解分布式系统

目录 一、前言二、双活数据中心三、数据备份方式四、设计双活数据中心需要考虑的问题1、延迟和稳定性2、Quorum/ Tie-Breaker3、工作负载 五、动态数据中心六、深入理解分布式系统1、内容介绍2、作者简介 大家好&#xff0c;我是哪吒。 文末送5本《深入理解分布式系统》 一、…

CentOS:Docker容器中安装vim

在使用docker容器时&#xff0c;里边没有安装vim时&#xff0c;敲vim命令时提示说&#xff1a;vim: command not found 这个时候就须要安装vim&#xff0c;安装命令&#xff1a; apt-get install vim 出现以下错误&#xff1a; 解决方法&#xff1a; apt-get update 这个命令的…

LabVIEW的六轴工业机器人运动控制系统

LabVIEW开发六轴工业机器人运动控制系统 本项目开发了一个高效的工业机器人控制系统&#xff0c;重点关注于运动学算法和轨迹规划算法的实现和测试。LabVIEW作为一个关键技术&#xff0c;在项目中扮演了核心角色。 系统研究与算法开发&#xff1a;首先&#xff0c;项目围绕机…

棱镜七彩获工业和信息化部电子第五研究所感谢信

近日&#xff0c;工业和信息化部电子第五研究所&#xff08;以下简称“工信部电子五所”&#xff09;发来一封感谢信&#xff0c;对棱镜七彩在系统研发及运维保障工作中做出的贡献表示感谢。 图 工业和信息化部电子第五研究所感谢信 服务保障平台和赛宝优选平台应用解决方案征…

计算机网络-网络协议

一、TCP/IP协议 作为一个小萌新&#xff0c;当然我无法将tcp/ip协议的大部分江山和盘托出&#xff0c;但是其中很多面试可能问到的知识&#xff0c;我觉得有必要总结一下&#xff01; 首先&#xff0c;在学习tcp/ip协议之前&#xff0c;我们必须搞明白什么是tcp/ip协议。 1、…

合伙企业对外投资收益怎么纳税?

根据合伙企业的税收政策&#xff0c;合伙企业对外投资收益的纳税问题需要根据投资所得的性质进行分类处理。 首先&#xff0c;如果合伙企业对外投资获得的收益属于股息、红利、利息等被动收入&#xff0c;那么这些收入需要按照个人所得税法中的“利息、股息、红利所得”进行纳税…

【蓝桥杯】树的重心

树的重心 图的dfs模板 int dfs(int u) {st[u]true;for(int ih[u];i!-1;ine[i]){int je[i];if(!st[j]){dfs(j);}} }树是这样的。 邻接表&#xff1a; 1: 4->7->2->-1 2: 5->8->1->-1 3: 9->4->-1 4: 6->3->1->-1 5: 2->-1 6: 4->-1 7…

【数据库】函数依赖

什么是函数依赖 就是在具体的表中/问题中&#xff0c;哪个属性决定另外几个属性。 A属性值相同的时候&#xff0c;能否决定唯一的B U {学号&#xff0c;姓名&#xff0c;年龄&#xff0c;班号&#xff0c;班长&#xff0c;课号&#xff0c;成绩} 就有&#xff1a; ‘学号’ 决…

【数组Array】力扣-1094 拼车

目录 题目描述 解题过程 题目描述 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassen…

【Netty】NIO与Netty核心概念

目录 NIO编程NIO介绍NIO和BIO的比较缓冲区(Buffer)基本介绍常用API缓冲区对象创建添加数据读取数据 通道(Channel)基本介绍Channel常用类ServerSocketChannelSocketChannel Selector (选择器)基本介绍常用API介绍示例代码 NIO 三大核心原理 Netty核心概念Netty 介绍原生 NIO 存…

机器视觉运动控制一体机在喇叭跟随点胶上的应用

市场应用背景 点胶是通过使用多种粘合剂&#xff0c;实现产品密封、绝缘、导热和耐腐蚀等作用&#xff0c;可应用于多类产品的生产制造场景&#xff0c;例如3C消费电子、汽车新能源、光伏和半导体等领域。 点胶是喇叭生产过程中必不可少一道工艺&#xff0c;音圈是扬声器的重…