使用处理程序访问共享数据

时间:2014-06-29 17:17:32

标签: java android multithreading android-handler

在我的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();
             }

}

如上所述,在onReceive()的{​​{1}}中,它会调用myReceiver方法来访问accessData()但是另一个工作线程(主线程除外)也可以调用mData方法。这意味着线程安全。

由于Handler从消息队列中逐个处理消息,我是否可以通过以下方式使用Handler来使上述情况具有线程安全性?还是有更优雅的方式?

accessData()

我现在通过上述方式使用处理程序来保护安全吗?

1 个答案:

答案 0 :(得分:0)

如果方法accessData()很快,那么只需将其声明为synchronized。如果它是长时间运行的,那么,除了声明它同步之外,还要从onReceive()调用它时运行它正在运行的线程,因为默认情况下在主(UI)线程上调用onReceive(),这个线程不能被占领了很长时间。如何在主线程之外执行长时间运行的工作在别处描述。

APPEND: 你的实现可能会起作用,但有一些缺陷:由accessData()引起的实际工作的线程是执行MyClass构造函数的线程。首先,这是糟糕的设计:初始化线程可能会改变,程序可能会停止工作,因为新线程可能没有Looper。然后,初始化线程是UI线程,这意味着当正常UI线程必须从任何非UI工作中解脱时,即使工作线程也将工作委托给UI线程。

处理程序和循环程序不是通用的方法,应尽可能使用。首先要学习多线程编程的基础知识,你会发现没有它们就可以生存。