本篇数据来源:聚合数据,一个简单的例子,通过调用API接口进行数据解析后,加载到我们的模拟器中。开始之前我们要清楚做这个demo的一个具体步骤,下面我将一步步进行编写。
首先准备工作:
导入okhttp与Gson()的库:在build.gradle(.app)中
implementation 'com.squareup.okhttp3:okhttp:3.8.0' implementation 'com.google.code.gson:gson:2.9.1'
还有网络请求权限在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.INTERNET"/>
还有一点:在Android 9.0(P ,API 28)版本中,限制了http明文流量的网络请求,未加密的流量请求都会被系统禁掉。
所以如果当前应用的请求是 htttp 请求,而非 https,这样就会导系统禁止当前应用进行该请求。
我们还需要加入一行代码:
<application...android:usesCleartextTraffic="true"...</application>
好了,现在可以开始写代码了。
一、布局代码
布局代码很简单,就一个输入框和放数据的文本以及一个按钮
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal">
<!-- 输入框 --><EditTextandroid:id="@+id/ed1"android:layout_width="250dp"android:layout_height="wrap_content"android:hint="输入你的星座" />
<!-- 按钮--><Buttonandroid:id="@+id/but1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:backgroundTint="#81B348"android:text="查询" /></LinearLayout>
<!-- 文本 --><TextViewandroid:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#0B0A0A"android:textSize="18sp" /></LinearLayout>
</FrameLayout>
关于布局文件就不多说了
二、主逻辑代码
在MainActivity编写我们的逻辑代码,也很简单1、获取控件id,2、进行网络请求,3、解析数据
上代码
package com.example.myapplicationimport android.annotation.SuppressLint
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.gson.Gson
import okhttp3.OkHttpClient
import okhttp3.Request
import kotlin.concurrent.threadclass MainActivity : AppCompatActivity() {//定义变量获取控件lateinit var ed1: EditTextlateinit var tv1: TextViewlateinit var but1: Button@SuppressLint("SetTextI18n")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//获取控件ided1 = findViewById(R.id.ed1)tv1 = findViewById(R.id.tv1)but1 = findViewById(R.id.but1)//案件跳转事件but1.setOnClickListener {val a = ed1.text.toString() //获取输入框的内容,也就是待会我们输入的星座//在子线程中开始进行数据请求,这个写法一般都是固定的使用的是GET请求thread {val request = Request.Builder().url("http://web.juhe.cn/constellation/getAll?consName=$a&type=today&key=聚合数据申请的key").build()val response = OkHttpClient().newCall(request).execute() //调用okhttp的execute()方法获取链接返回的数据val json = response.body()?.string() //得到具体返回的数据val responseNews = Gson().fromJson(json, News::class.java) //开始进行第三步,数据解析,这里我使用的是GSON(),那么我们就要先创建一个Gson()数据类if (responseNews != null) {runOnUiThread { //最后关于视图刷新,也就是ui的操作需要放在主线程里tv1.setText("星座名称:" + responseNews.name + "\n"+ "查询时间:" + responseNews.datetime + "\n"+ "综合指数:" + responseNews.all + "\n"+ "幸运色:" + responseNews.color + "\n"+ "健康指数: " + responseNews.health + "\n"+ "爱情指数: " + responseNews.love + "\n"+ "财运指数: " + responseNews.money + "\n"+ "幸运数字: " + responseNews.number + "\n"+ "速配星座: " + responseNews.QFriend + "\n"+ "今日概述: " + responseNews.summary + "\n"+ "工作指数: " + responseNews.work + "\n")}}}}}
}
上述代码其实都很好理解,okhttp的请求方式基本是固定的,下面展示Gson()的数据类,然后你就能理解关于视图刷新的这个写法了
三、创建一个Gson()的数据类
其实这步应该放在第二步的,草率了....不过不影响,咋们继续,现在有个问题,就是我们要创建什么数据类呢?其实也很简单
要创建什么数据类,就要看服务器给我们返回了什么数据,以及我们需要什么数据,下面我们去看聚合数据具体给我们返回了什么数据(对了聚合数据返回的是json格式的数据)
也就是:
{
"date":20221013,
"name":"天秤座",
"QFriend":"天秤座",
"color":"浅蓝色",
"datetime":"2022年10月13日",
"health":"80",
"love":"80",
"work":"75",
"money":"80",
"number":8,
"summary":"运势的不稳定因素较多,容易出现模棱两可的态度,受到各种建议或评价的干扰。存在感比较低,过于沉默做事的姿态也会容易让别人忽略你所付出的努力。生活方面容易在无聊的事情上浪费时间,比如逛微博或是发呆等。",
"all":"85",
"resultcode":"200",
"error_code
(这样看可能清晰一点)
通过聚合数据请求我们可以看到返回的相关数据,那么现在我们就去创建一个数据类,(因为本人用的kotlin可能和java有些差别,不过差别不大,有时间我可以出一个java版本的)看代码:
package com.example.myapplication//GSON数据类
data class News(val name : String,val QFriend : String,val color : String,val datetime: String,val all : String,val health : String,val love : String,val money : String,val number : String,val summary : String,val work : String)
可以看到非常简单就对应着服务器返回的数据格式挨着创建就行,最后回到第二部的最后几行代码:
val responsexz = Gson().fromJson(json, News::class.java) //开始进行第三步,数据解析,这里我使用的是GSON(),那么我们就要先创建一个Gson()数据类if (responseNews != null) {runOnUiThread { //最后关于视图刷新,也就是ui的操作需要放在主线程里tv1.setText("星座名称:" + responseNews.name + "\n"+ "查询时间:" + responseNews.datetime + "\n"+ "综合指数:" + responseNews.all + "\n"+ "幸运色:" + responseNews.color + "\n"+ "健康指数: " + responseNews.health + "\n"+ "爱情指数: " + responseNews.love + "\n"+ "财运指数: " + responseNews.money + "\n"+ "幸运数字: " + responseNews.number + "\n"+ "速配星座: " + responseNews.QFriend + "\n"+ "今日概述: " + responseNews.summary + "\n"+ "工作指数: " + responseNews.work + "\n")}}
现在看这段代码应该比较清晰了,定义一个responsexz变量解析这个json(没错Gson就是这么神奇),然后判断只要我们请求的数据不为空就调用setText方法将解析的数据放到文本框中,其实到这基本就已经结束了
最后我们来看一下运行效果
由于我也是个安卓小白,学安卓也是因为兴趣,关于这文章我还是不太会,可能有些地方表达不清楚,欢迎到评论区一起探讨,努力一定会有回报的加油!!