安卓开发学习---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 + urlprintln("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()//获取bodyval 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 + urlprintln("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) {//获取bodyval 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 {//创建bodyval body2 = FormBody.Builder().add("key", "value")//添加参数.add("key2", "value2").build()val string2 = BaseUrl + urlprintln("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()//获取bodyval body:String? = response.body?.string()//结果打印Log.e("OKHTTP", "get response body = ${body}")println("get response body = ${body}")}).start()} 

异步请求

	//post异步方法fun postAsync(url: String){//创建bodyval body2 = FormBody.Builder().add("key", "value")//添加参数.add("key2", "value2").build()val string2 = BaseUrl + urlprintln("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) {//获取bodyval 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)//获取bodyvar 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.Gsonfun main(){//json串val json ="{\"uid\":\"00001\",\"userName\":\"Freeman\",\"telNumber\":\"13000000000\"}";//创建一个gson对象var gson = Gson()//json转modelval 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()//传递数据//创建一个bundleval 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 = 2var key2 = "qqqqq"override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {//        return inflater.inflate(R.layout.activity_third, container, false)//创建一个textViewval textView = TextView(context)textView.text = key2textView.setTextSize(22F)textView.gravity = Gravity.CENTERreturn textView}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)key1 = arguments?.getInt("key1") ?: 3key2 = arguments?.getString("key2") ?: "pppp"println("key1 = ${key1}")println("key2 = ${key2}")//该view,就是上面创建的TextViewval textView = view as TextViewtextView.text = key2}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 内存管理的秘密武器:垃圾回收(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

SQL进阶理论篇(十四):CBO优化器是如何计算代价的?

文章目录 简介能调整的代价模型的参数有哪些&#xff1f;mysql.server_costmysql.engine_cost 如何修改这些代价参数&#xff1f;代价模型具体是如何计算的参考文献 简介 大部分RDBMS都支持基于代价的优化器CBO&#xff0c;但其实CBO仍然存在缺陷&#xff08;比如参数配置的不…

Android 原始方法实现Tablayout样式

源码&#xff1a; 【免费】Android原始方法实现Tablayout样式资源-CSDN文库 推荐&#xff1a; GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout …

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说&#xff0c;渲染速度慢是一个常见问题&#xff0c;尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师&#xff0c;他们通常使用3ds Max这样的工具&#xff0c;而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…

Spring事务浅析

一:Spring事务简介 什么是事务&#xff1a; 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么一起成功&#xff0c;要么一起失败&#xff0c;是一个不可分割的工作单元。 在我们日常工作中&#xff0c;涉及到事务的场景非常多&#xff0c;一个…

一、串行FLASH文件系统FatFs简介

本节主要给大家介绍以下内容&#xff1a; 文件系统简介 FatFs文件系统简介 FatFs文件系统移植 FatFs功能使用 一、文件系统简介 当我们在使用SPI FLASH直接存储数据 当需要记录字符“STM32 SPI FLASH”时。可以把这些文字转化成ASCII码&#xff0c;存储在数组中&#xff0…

查看CPU的型号方法很多,而且步骤简单

每台计算机至少包含一个处理器&#xff0c;也称为CPU或中央处理单元。你电脑的CPU可能是由英特尔或AMD制造的。以下是如何查看你的CPU以及它的速度。 在设置应用程序中查找你的CPU 要在Windows 10或Windows 11设置应用程序中查找此信息&#xff0c;请导航到“设置”>“系统…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用&#xff1a;一般用作要执行的处理(process)&#xff0c;在程序流程图中做执行框。 在axure中如果是画页面框架图&#xff0c;那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明&#xff0c;这个时候将两类不同的矩形…

spring MVC概述和土门案例(无配置文件开发)

SpringMVC 1&#xff0c;SpringMVC概述2&#xff0c;SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好&#xff0c;小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

C#拼接JSON

一、业务背景 最近项目需要与U8c对接&#xff0c;实现增删改查&#xff0c;借此机会&#xff0c;梳理一下C#解析Json字符串的问题。 这篇文章&#xff0c;先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json&#xff0c;无非就是{}和[]的来回嵌套。 首先&am…

JavaScript 内存管理的秘密武器:垃圾回收(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…