【发布时间】:2023-04-10 06:41:02
【问题描述】:
在我的 Android 项目中,我有一个注册了 BroadcastReceiver 的类:
public MyClass {
private MyData mData;
public MyClass(Context context) {
mData = GET_PERSISTED_DATA();
//code to register receiver
...
context.registerReceiver(myReceiver, filter);
}
public void accessData() {
//Code to access mData
...
}
private BroadcastReceiver myReceiver= new BroadcastReceiver() {
@Override
public void onReceive (Context context, Intent intent) {
//This is called in main UI thread
accessData();
}
}
如上所见,在myReceiver 的onReceive() 中,它调用accessData() 方法来访问mData。 然而,还有另一个工作线程(除了主线程)也可以调用accessData() 方法。这意味着它不是线程安全的。
由于Handler 会一一处理来自消息队列的消息,我可以通过以下方式使用Handler 来使上述情况成为线程安全的吗?还是有更优雅的方式?
public MyClass {
private MyData mData;
private Handler mHandler;
public MyClass(Context context) {
mData = GET_PERSISTED_DATA();
//code to register receiver
...
context.registerReceiver(myReceiver, filter);
mHandler = new MyHandler();
}
public void accessData() {
mHandler.sendMessage(mHandler.obtainMessage(1));
}
private class MyHandler extends Handler() {
@Override
void handleMessage(Message msg){
if(msg.what == 1){
//Code to access mData
...
}
}
}
private BroadcastReceiver myReceiver= new BroadcastReceiver() {
@Override
public void onReceive (Context context, Intent intent) {
//This is called in main UI thread
accessData();
}
}
通过上述方式使用处理程序,我现在线程安全吗?
【问题讨论】:
标签: java android multithreading android-handler