跳到主要内容

在线版掌上水果店案例操作说明

本说明文件仅用于2023年6月5日安卓应用开发课程练习

在前期的课程中我们学习了如何使用ListView和Fruit的Java类来实现本地水果店的案例,这节课程我们将学习使用第三方库来实现通过网络实时读取数据的在线版水果店的案例

用户权限

AndroidManifest.xml 文件中添加

AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />

并在 application 中添加 android:usesCleartextTraffic="true" 属性

警告

当使用okhttp等需要使用网络数据的方法或库时,需要在Manifest文件中添加用户权限,否则将无法正常运行使用网络数据的代码

第三方库的引用

在build.gradle文件中的dependencies中添加 implementation 'com.squareup.okhttp3:okhttp:4.9.0'implementation 'com.google.code.gson:gson:2.8.6' 来引入okhttp和gson第三方库

okhttp库和Bitmap的运用

okhttp.java
package com.fangcheng.fruitstore;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import org.json.JSONObject;

import java.net.URL;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

public class okhttp {
private static OkHttpClient client = new OkHttpClient();
private static String base = "https://fangchengblog.cn/api/";

//Get方法获取数据
public static JSONObject Get(String url) throws Exception {
String[] body = {null};
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Request request = new Request.Builder().url(base + url).build();
try {
body[0] = client.newCall(request).execute().body().string();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
thread.join();
return new JSONObject(body[0]);
}

//Post方法传输或获取数据
public static JSONObject Post(String url, String obj) throws Exception {
String[] body = {null};
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), obj);
Request request = new Request.Builder().url(base + url).post(requestBody).build();
try {
body[0] = client.newCall(request).execute().body().string();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
thread.join();
return new JSONObject(body[0]);
}

//Bitmap方法获取网络图片
public static Bitmap Bitmap(String net) throws Exception {
Bitmap[] bitmaps = {null};
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
bitmaps[0] = BitmapFactory.decodeStream(new URL(base + net).openStream());
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
thread.join();
return bitmaps[0];
}
}

API接口说明

属性参数
接口地址https://fangchengblog.cn/api/fruit.php
传输方式Get
返回数据类型Json

API返回数据说明

名称含义
data返回的主要数据
code返回状态码(状态码为200时则获取成功)
msg返回状态的信息
id商品唯一编号
name商品名称
level商品等级
info商品简介
stock商品库存
price商品价格
image商品图片的地址

API返回数据示例

{
"data": "[{\"id\":\"1\",\"name\":\"芒果\",\"level\":\"A级\",\"info\":\"鲜嫩多汁\",\"stock\":\"20\",\"price\":\"12.9\",\"image\":\"img\\/fruit\\/1.jpg\"},{\"id\":\"2\",\"name\":\"草莓\",\"level\":\"A级\",\"info\":\"口感饱满\",\"stock\":\"10\",\"price\":\"20.9\",\"image\":\"img\\/fruit\\/2.jpg\"},{\"id\":\"3\",\"name\":\"菠萝\",\"level\":\"S级\",\"info\":\"香甜可口\",\"stock\":\"30\",\"price\":\"29.9\",\"image\":\"img\\/fruit\\/3.jpg\"},{\"id\":\"4\",\"name\":\"西瓜\",\"level\":\"A级\",\"info\":\"多汁爽口\",\"stock\":\"50\",\"price\":\"30.9\",\"image\":\"img\\/fruit\\/4.jpg\"},{\"id\":\"5\",\"name\":\"石榴\",\"level\":\"A级\",\"info\":\"粒粒饱满\",\"stock\":\"20\",\"price\":\"28.8\",\"image\":\"img\\/fruit\\/5.jpg\"},{\"id\":\"6\",\"name\":\"猕猴桃\",\"level\":\"S级\",\"info\":\"香甜可口\",\"stock\":\"99\",\"price\":\"21.5\",\"image\":\"img\\/fruit\\/6.jpg\"},{\"id\":\"7\",\"name\":\"苹果\",\"level\":\"A级\",\"info\":\"甜度爆表\",\"stock\":\"20\",\"price\":\"30.9\",\"image\":\"img\\/fruit\\/7.jpg\"},{\"id\":\"8\",\"name\":\"车厘子\",\"level\":\"A级\",\"info\":\"颗颗香甜\",\"stock\":\"80\",\"price\":\"9.9\",\"image\":\"img\\/fruit\\/8.jpg\"}]",
"code": "200",
"msg": "success"
}