Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匿名内部类线程的集合同步引发空指针异常_Android - Fatal编程技术网

Android 匿名内部类线程的集合同步引发空指针异常

Android 匿名内部类线程的集合同步引发空指针异常,android,Android,当我的内部类尝试对基类中包含的集合进行“同步”时,Android JVM抛出空指针异常。如果我删除了对synchronized的调用,代码工作正常。当然,并发稍后会让我大吃一惊,所以我需要找到一个解决方案 我是android新手,但对Java并不陌生。observer模式的这种实现在Java中一直对我有效。如果我必须显式地将我的基类传递到一个非匿名类中,我会这样做,但这真是一个麻烦。我还可以创建一个新的更新函数,并从基类内部同步调用,但这一要求似乎违反了匿名类中应该允许的访问规则 public

当我的内部类尝试对基类中包含的集合进行“同步”时,Android JVM抛出空指针异常。如果我删除了对synchronized的调用,代码工作正常。当然,并发稍后会让我大吃一惊,所以我需要找到一个解决方案

我是android新手,但对Java并不陌生。observer模式的这种实现在Java中一直对我有效。如果我必须显式地将我的基类传递到一个非匿名类中,我会这样做,但这真是一个麻烦。我还可以创建一个新的更新函数,并从基类内部同步调用,但这一要求似乎违反了匿名类中应该允许的访问规则

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);
          }
        }
      }
    });


  }
}
公共类基类
{
私有ArrayList myListeners=新ArrayList();
公共基类()
{
StartWorker();
}
公共void addListener(IListenerInterface侦听器)
{
已同步(myListeners)
{
添加(侦听器);
}
}
公开作废StartWorker()
{
Thread myThread=新线程(new Runnable()){
公开募捐{
while(true)
{
//…在此阻塞,直到完成工作
//然后…做一些工作。。。。
//现在尝试更新侦听器
同步(myListeners)/奇怪的行为。。
首先,我会尝试使用
final
modificator引用侦听器列表,以避免修改该引用。之后,我希望通过在
this
上同步而不是在
myListeners
上同步,使类“线程安全”