当我的内部类试图在基类中包含的集合上“同步”时,Android JVM会抛出空指针异常。如果我删除了对synchronized的调用,代码工作正常。当然,然后并发性将会引发我的屁股,所以我需要找到解决方案。
我是Android新手,但不是Java新手。观察者模式的这种实现在Java中一直对我有用。如果我必须明确地将我的基类传递给非匿名类来执行此操作,那么我将会感到痛苦。我还可以创建一个新的更新函数并从基类内部调用synchronized,但该要求似乎违反了匿名类中应该允许的访问规则。
public class BaseClass
{
private ArrayList<IListenerInterface> myListeners = new ArrayList<IListenerInterface>();
public BaseClass()
{
StartWorker();
}
public void addListener(IListenerInterface listener)
{
synchronized(myListeners)
{
myListeners.add(listener);
}
}
public void StartWorker()
{
Thread myThread = new Thread(new Runnable() {
public void run() {
while(true)
{
// ... blocks here until work to be done
// then...do some work ....
// now try to update the listeners
synchronized(myListeners) // <-- NULL POINTER EXCEPTION Call back to the enclosing classes myListeners collecion
{
// never get to this point...
myListeners.Update(someWork);
}
}
}
});
}
}
答案 0 :(得分:0)
奇怪的行为..
首先,我会尝试使用final
修饰符来引用侦听器列表,以避免修改该引用。在那之后,我想通过this
而不是myListeners
同步来使课程“线程安全”。