2011-11-17 35 views
0

當我的內部類試圖對包含在基類中的集合「同步」時,Android JVM會拋出空指針異常。如果我刪除了調用synchronized,代碼工作正常。當然,那麼後來併發會踢我的屁股,所以我需要找到一個解決方案。從匿名內部類線程收集同步時拋出空指針異常

我是新來的android,但不是新的Java。這個觀察者模式的實現一直在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); 
      } 
     } 
     } 
    }); 


    } 
} 

回答

0

奇怪的行爲..所有的 首先,我會嘗試使用final變質爲參考聽衆的名單,以避免基準的修改。之後,我想通過在this而不是myListeners上同步來使課程「線程安全」。