0

我使用的RecyclerView顯示來自GCM回調的結果。 RecyclerView有一個自定義適配器的方法添加,還有一個進度條,使用asynctask進行更新。Android - 回收站與GCM查看

消息recieving超過GCM工作正常:在自定義適配器

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mAdapter.add(new ResultRecord("asf", 89, 1000)); 
      } 
     }); 
    } 
}; 

添加方法:

public void add(final ResultRecord result) { 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       results.add(0, result); 
       notifyItemInserted(0); 
      } 
     }); 
    } 

的問題是,該方法添加一個名爲沒有任何反應的UI。該方法添加調用,然後onBindViewHolder和回收視圖不更新。只有當進度條完成時,RecylcerView正在更新之前添加的所有ViewHolder

我檢查瞭如果add方法從onCreate方法工作,它工作正常。也許這個問題與線程有關。

+0

當進度條出現在頂部時,活動在onPause狀態是正常的。可以防止RV更新? – Droidekas

回答

0

這裏有一個線程問題。

您的代碼基於ArrayList,它不是線程安全的。您正在調用可能來自多個線程的事件中的「添加」方法。

你必須同步你的代碼。事情是這樣的:

private final ReentrantLock lock = new ReentrantLock(); 
public void add(final ResultRecord result) { 
    lock.lock(); 
    try { 
     AddNotThreadSafe(result); // Only one thread add in same time. Now is safe for executing. 
    } finally { 
     lock.unlock(); 
    } 
} 

現在,移動您的原始Add代碼分離的方法稱爲AddNotThreadSafe

這應該工作。 :)