0

Я использую RecyclerView, который показывает результаты, полученные из GCM обратных вызовов. У RecyclerView есть пользовательский адаптер, который добавляет метод, есть также индикатор выполнения, который обновляется с использованием асинтезы.Android - Recycler View with GCM

Сообщение ПОЛУЧАТЬ над 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)); 
      } 
     }); 
    } 
}; 

метод Add в пользовательском адаптере:

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

Проблема заключается в том, что метод добавить называется, и ничего не происходит на пользовательском интерфейсе. Метод add called, а затем onBindViewHolder, и просмотр recycler не обновляется. Только когда индикатор выполнения завершен, RecylcerView получает обновление со всеми ViewHolder, которые были добавлены ранее.

Я проверил, работает ли метод add из метода onCreate, и он отлично работал. Возможно, эта проблема связана с потоковой обработкой.

+0

Когда в верхней части отображается индикатор прогресса, в нормальном режиме onPause активен. Возможно ли предотвратить обновление RV? – Droidekas

ответ

0

У вас проблема с Threading.

Ваш код основан на 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.

Это должно сработать. :)