在Android开发中,UI(用户界面)的更新通常需要在主线程进行,因为主线程是负责处理用户交互的。然而,当我们的应用执行耗时操作,如网络请求或数据库操作时,这些操作应该在子线程中进行,以避免阻塞主线程导致应用无响应。`Handler`机制就是Android中一种常用的解决此类问题的方式,它允许我们在子线程中执行任务,然后通过`Handler`将结果发送回主线程更新UI。
`Handler`是Android中的一个关键组件,它用于处理来自其他线程的消息。`Handler`有两种主要的工作方式:`sendMessage()`和`post()`。在这里,我们主要关注`post()`方法,它接收一个`Runnable`对象作为参数。当我们调用`Handler.post(Runnable r)`时,`Runnable`的`run()`方法将在`Handler`所在线程中执行。在Android中,主线程有一个默认的`Looper`,它会不断检查是否有待处理的消息。如果`Handler`是在主线程创建的,那么它就会关联到这个`Looper`,这样`Runnable`就会在主线程中运行。
在给出的代码示例中:
```java
mHandler.post(new Runnable() {
@Override
public void run() {
myView.invalidate();
mHandler.postDelayed(this, 5);
}
});
```
这里创建了一个匿名的`Runnable`对象,`run()`方法被用来更新UI。`myView.invalidate()`会标记当前视图需要重绘,系统会在下一次绘制周期中调用`onDraw()`方法。`mHandler.postDelayed(this, 5);`则会延迟5毫秒后再次运行这个`Runnable`,实现了持续更新的效果。
另一个使用`postInvalidate()`的例子是在子线程中更新UI:
```java
new Thread(new myThread()).start();
class myThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
myView.postInvalidate();
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
```
这段代码创建了一个新的子线程,并在其`run()`方法中不断调用`myView.postInvalidate()`。`postInvalidate()`会将刷新请求放入主线程的消息队列,等待主线程处理。这样,即使在子线程中,也能安全地触发UI的更新。
总结起来,`Handler`和`postInvalidate()`在Android开发中用于异步更新UI,确保UI操作始终在主线程执行,从而保持应用的响应性。开发者可以通过创建`Handler`实例、定义`Runnable`并使用`post()`或`postDelayed()`来安排UI更新,或者直接在子线程中调用`postInvalidate()`来触发视图的重绘。在实际项目中,这种异步更新UI的方法非常常见,也是解决Android性能问题的关键技术之一。