一、线程基础想象你在餐厅:
- 主线程(UI线程) = 服务员,负责和顾客互动
- 工作线程 = 厨师,负责在后厨做菜
- 为什么需要多线程? 就像服务员不能在厨房炒菜,Android的主线程不能做耗时操作(比如网络请求)
创建一个工作线程的简单方法:
new Thread(new Runnable() {
@Override
public void run() {
// 这里写要做的事情
}
}).start();
二、线程间通信(Handler机制)
就像餐厅里服务员和厨师的对讲机:
// 1. 创建对讲机(Handler)
class MyHandler extends Handler {
public void handleMessage(Message msg) {
// 接收到消息后要做的事
}
}
// 2. 发送消息
Message msg = new Message();
msg.what = 1; // 消息类型(比如1表示菜做好了)
msg.obj = "具体内容"; // 具体消息内容
myHandler.sendMessage(msg);
三、网络请求(OkHttp)
就像打电话点外卖:
- 创建请求:
// 相当于拿起电话准备拨号 Request request = new Request.Builder() .url("网址") .header("Authorization", token) // 身份验证 .build();
2.发送请求:
// 异步请求(不会卡住主线程)
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
// 收到回复后要做的事
}
});
四、JSON数据处理
JSON就像一个有规律的便条,比如:
{
"name": "小明",
"age": 18,
"hobby": ["足球", "篮球"]
}
处理JSON有两种主要方式:
- Gson方式(自动方式):
// 像用翻译机一样,直接把JSON变成Java对象
JsonRootBean app = new Gson().fromJson(jsonString, JsonRootBean.class);
// 直接用对象的属性
String name = app.name;
2.JSONObject方式(手动方式):
// 像手动查字典一样
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.optString("name");
五、实际应用流程
- 获取数据流程:
// 1. 在后台线程发送请求
new Thread(() -> {
// 发送网络请求
......
// 获取数据后,打包成消息
Message msg = new Message();
msg.what = 1; // 标记消息类型
msg.obj = 响应数据;
// 发送给Handler
myHandler.sendMessage(msg);
}).start();
// 2. Handler收到消息后更新界面
class MyHandler extends Handler {
public void handleMessage(Message msg) {
if (msg.what == 1) {
// 解析数据
JsonRootBean data = new Gson().fromJson((String)msg.obj, JsonRootBean.class);
// 更新界面
textView.setText(data.某个值);
}
}
}
六、常见问题解答
1.为什么网络操作要在子线程?
- 就像服务员不能自己去厨房炒菜,否则就没人招呼客人了
- Android主线程负责UI交互,不能做耗时操作
2.为什么要用Handler?
- 因为Android规定只有主线程能更新UI
- Handler就像传菜员,把后厨(子线程)的菜送到前台(主线程)
3.Gson和JSONObject怎么选?
- Gson适合处理复杂的JSON数据,自动转换很方便
- JSONObject适合简单的数据提取,更灵活
4.异步和同步的区别?
- 同步:像排队买饭,必须等前面的人买完
- 异步:像点外卖,下单后可以做别的事,等外卖送到再处理