哎,各位Android开发道友,不知道你们有没有经历过这种大型社死现场:你精心打磨的APP,界面那叫一个炫酷,功能那叫一个齐全,结果用户一点某个按钮——咔!界面直接冻住,一秒、两秒……甚至弹出了那个万恶的“Application Not Responding”(ANR)弹窗。
那一刻,你是不是想顺着网线爬过去跟用户解释:“兄嘚,你听我说,是我的手机在思考人生!”
别傻了,这口大锅,妥妥得你来背。而罪魁祸首,十有八九就是——你把耗时的活儿,全都塞给了主线程(UI线程)去干!
你可以把主线程想象成一个脾气很好的餐厅服务员,它的主要工作是接待你(响应用户点击)、给你端菜(更新UI)、听你唠叨(处理UI事件)。结果你倒好,让它去后厨徒手劈榴莲(网络请求)、手磨豆浆(大量文件读写)、或者解一道微积分(复杂计算)。它这一去,前厅不就没人管了吗?用户点不了菜,也结不了账,可不就卡成PPT,甚至直接闪退咯。
所以,修仙之路的第一课就是:“好刀要用在刀刃上,重活要交给后台线程!”
今天,咱们就来深度修炼Android多线程世界里,最优雅、最受推崇的功法之一——通过实现 Runnable 接口来创建线程。
第一章:为啥是Runnable?直接继承Thread它不香吗?
香?乍一看是挺香,但那是“路边摊的香”,吃多了容易拉肚子(写出糟糕的代码)。且听我细细道来。
1.1 “继承Thread”派——直男癌式编程
传统做法是直接继承 Thread 类,重写 run() 方法。
public class MyThread extends Thread {
@Override
public void run() {
// 在这里执行耗时操作,比如下载图片
Log.d("MyThread", "我在后台默默下载图片呢!");
}
}
// 使用的时候
MyThread thread = new MyThread();
thread.start(); // 启动新线程
简单粗暴,没毛病。但问题在于,Java是单继承的!你的类一旦继承了 Thread,就再也无法继承其他类了。这就好比你把“我会开车”这个技能,直接刻在了你的基因里(继承),导致你不能再继承“我会开飞机”的基因。灵活性大打折扣。
1.2 “实现Runnable”派——接口大师,灵活就业
而实现 Runnable 接口,则是一种更高级的玩法。
public class MyRunnable implements Runnable {
@Override
public void run() {
// 同样是在这里执行耗时操作
Log.d("MyRunnable", "我也在下载图片,但我更优雅!");
}
}

最低0.47元/天 解锁文章
2988

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



