使用okhttp请求聚合数据之星座运势

本篇数据来源:聚合数据,一个简单的例子,通过调用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方法将解析的数据放到文本框中,其实到这基本就已经结束了

最后我们来看一下运行效果

 

由于我也是个安卓小白,学安卓也是因为兴趣,关于这文章我还是不太会,可能有些地方表达不清楚,欢迎到评论区一起探讨,努力一定会有回报的加油!!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值