从匿名内部类线程收集同步会引发空指针异常

时间:2011-11-17 15:30:04

标签: android

当我的内部类试图在基类中包含的集合上“同步”时,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);
          }
        }
      }
    });


  }
}

1 个答案:

答案 0 :(得分:0)

奇怪的行为.. 首先,我会尝试使用final修饰符来引用侦听器列表,以避免修改该引用。在那之后,我想通过this而不是myListeners同步来使课程“线程安全”。