在一个可以工作的应用程序中,我看到了这个可怕的代码:
class SomeUglyClass extends Thread {
ArrayList<SomeData> someDataStructure = new ArrayList<SomeData>();
Handler mHandler = new Handler() {
// a lot
// writing to someDataStructure
}
public void run() {
int some_count, ...;
while(true) {
// a lot
// r/w access to someDataStructure
try {
Thread.sleep(1, 0);
} catch (Exception e) {
break;
}
}
} // end of run(), total 500 lines of code
} // end of SomeUglyClass, total 4K lines of code
也许您已经看到了这段代码的问题。如果没有,它们是:
mHandler
附加到 UI 线程(因为它是由加载类的线程创建的,也就是主线程)没有活套(这实际上是错误)
该线程浪费CPU时间并耗尽电池
someDataStructure
不是线程安全的,但同步基本访问操作无济于事;在无限循环中同步大块代码可能会阻塞受保护的资源并使其对其他线程不可用;最后,不仅如此someDataStructure
,整个类都基于只有一个线程可以运行其代码的假设。我不能只添加looper,因为
run()
必须运行无限循环,同时Looper.loop();
也是一个无限循环。一个线程不能运行两个无限循环。
尽管有这个史诗般的架构失败,但代码确实在做一些事情,它不能立即重写,它是 4K 行代码,而且我通常只能猜测代码真正做了什么。
我需要重构它。它应该是一系列保留功能的小步骤。
我如何重构这个了不起的代码?