0

RecyclerViewを使用しており、GCMコールバックの結果が表示されます。 RecyclerViewには、カスタムアダプターのメソッドaddがあります。また、asynctaskを使用して更新するプログレスバーもあります。正常に動作しますGCM上recievingGCMを使用したAndroid - Recyclerビュー

メッセージ:

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に起こりません。 addメソッド、onBindViewHolderメソッド、およびリサイクラビューは更新されません。プログレスバーが終了した場合にのみ、RecylcerViewは以前に追加されたViewHolderで更新されています。

onCreateメソッドからaddメソッドが機能するかどうかを確認しても問題ありません。たぶんこの問題はスレッディングに関連しています。

+0

トップに進行状況バーがある場合、アクティビティはonPause状態では正常です.RVが更新されないようにすることはできますか? – Droidekas

答えて

0

ここにスレッディングの問題があります。

コードは、スレッドセーフではないArrayListに基づいています。おそらく複数のスレッドから呼び出されたイベントから "Add"メソッドを呼び出しています。

コードを同期させる必要があります。このような何か:今

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

AddNotThreadSafeと呼ばれる分離方法にあなたの元Addコードを移動します。

これは動作するはずです。 :)

関連する問題