嘿,各位未来的Android大神们,今天咱们不聊风花雪月,来点真枪实弹的——做一个简易打地鼠游戏!
别撇嘴,我知道你在想啥:“打地鼠?也太复古了吧!” 兄弟,此言差矣!这个看似简单的小游戏,可是藏着Android语言基础里两位重量级大佬:线程 和 消息处理。搞懂它,你就能轻松拿捏那些需要“后台干活、前台更新”的复杂场景,比如下载进度条、聊天消息接收、视频流加载等等。
所以,今天咱们的目标不是做一个多炫酷的游戏,而是借“打地鼠”这个壳,把Android多线程与消息处理的“灵魂”给你彻底讲透!
一、 游戏灵魂解剖:为什么打地鼠会“卡死”?
想象一下这个场景:你兴冲冲地写好了游戏,地鼠随机从洞里钻出来。你一运行,咦?地鼠要么半天不动,要么你一点击屏幕,整个游戏就卡住,甚至弹出一个“Application Not Responding”(ANR)的崩溃对话框。
罪魁祸首就是:你把所有活儿都扔给UI主线程去干了!
- UI主线程(霸道总裁):它是App的“门面担当”,主要负责处理和绘制用户界面、响应用户的点击、滑动等操作。它有个臭脾气:不能阻塞!
- 地鼠的“工作”:让地鼠随机时间、随机位置出现,这本质上是一个需要持续运行、等待、再运行的循环任务。如果把这事儿交给UI线程,它就会一直忙于计算“下一个地鼠在哪”,根本没空理会你的点击操作。你点了屏幕没反应,Android系统等了幾秒后就会暴走:“这App死了吧?”,然后直接ANR给你看。
结论:所有耗时操作(比如网络请求、复杂计算、循环等待)都必须放在子线程里执行,绝不能阻塞UI主线程。
二、 降鼠第一式:创建子线程——“地鼠生成器”
那么,谁来负责源源不断地“制造”地鼠呢?就是我们勤劳的子线程!
在Android中,我们可以直接使用Thread类,或者更优雅的Runnable接口。
// 这就是我们的“地鼠生成器”
private class MoleGenerator implements Runnable {
private boolean isRunning = true; // 控制生成器开关
@Override
public void run() {
// 这个run()方法里的代码,就是在子线程中运行的!
while (isRunning) {
// 1. 随机一个等待时间(模拟地鼠钻出洞的间隔)
try {
Thread.sleep(random.nextInt(2000) + 500); // 500ms到2500ms之间
} catch (InterruptedException e) {
e.printStackTrace();
}
// 2. 随机选择一个洞(0-8共9个洞)
int randomHole = random.nextInt(9);
// 3. 重磅!通知主线程:“有个地鼠在X号洞冒头了!”
// 这里我们先卖个关子,下面会重点讲
Message msg = gameHandler.obtainMessage();
msg.what = MOLE_APPEAR; // 消息类型:地鼠出现
msg.arg1 = randomHole; // 把洞的编号塞进消息里
gameHandler.sendMessage(msg);
}
}
public void stop() {
isRunning = false;
}
}
看,我们在子
安卓打地鼠游戏实战

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



