Android 子线程 如果加锁
时间: 2024-09-23 15:05:47 浏览: 44
在Android中,当我们在子线程(如AsyncTask、HandlerThread或者其他自定义线程)执行耗时操作时,为了避免修改UI线程的可见状态(比如更新UI组件),我们通常会在子线程中加锁,最常见的是使用synchronized关键字或者通过Handler/Looper来实现同步。以下是两种常见的做法:
1. **synchronized块或方法**:
- 使用`synchronized(this)`包裹需要同步的代码段,这样每次只有一个线程能够进入该同步代码块。
```java
public class MyTask extends AsyncTask<Void, Void, Bitmap> {
private final Object lock = new Object();
protected Bitmap doInBackground(Void... params) {
synchronized(lock) {
// 在这里执行耗时操作
}
}
}
```
2. **Handler/Looper机制**:
- 创建一个Handler,并将其绑定到主线程的Looper,然后在子线程里发送消息,让主线程在消息队列中处理这些消息时更新UI。
```java
Handler mainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 在这里的代码将在主线程运行,因此可以直接更新UI
}
};
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = ...; // 执行耗时操作
mainHandler.sendMessage(Message.obtain(mainHandler, 0, bitmap));
}
}).start();
```
加锁的主要目的是为了保证线程安全,防止并发修改UI时引发的问题,如异常、数据不一致等。但是过度使用锁也可能导致性能下降,所以在实际应用中需要权衡利弊。
阅读全文