在线版掌上水果店案例操作说明
本说明文件仅用于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"
}