本篇数据来源:聚合数据,一个简单的例子,通过调用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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!-- 输入框 -->
<EditText
android:id="@+id/ed1"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:hint="输入你的星座" />
<!-- 按钮-->
<Button
android:id="@+id/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="#81B348"
android:text="查询" />
</LinearLayout>
<!-- 文本 -->
<TextView
android: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.myapplication
import 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.thread
class MainActivity : AppCompatActivity() {
//定义变量获取控件
lateinit var ed1: EditText
lateinit var tv1: TextView
lateinit var but1: Button
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//获取控件id
ed1 = 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方法将解析的数据放到文本框中,其实到这基本就已经结束了
最后我们来看一下运行效果
由于我也是个安卓小白,学安卓也是因为兴趣,关于这文章我还是不太会,可能有些地方表达不清楚,欢迎到评论区一起探讨,努力一定会有回报的加油!!