[英]Android - Recycler View with GCM
我正在使用顯示來自GCM
回調的結果的RecyclerView
。 RecyclerView
有一個添加方法的自定義適配器,還有一個進度條,可使用asynctask更新。
通過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);
}
});
}
問題是方法add被調用,UI上沒有任何反應。 先調用add方法再調用onBindViewHolder,然后回收站視圖不會更新。 僅當進度條完成時, RecylcerView
才會使用之前添加的所有ViewHolder
更新。
我已經檢查了add方法是否可以從onCreate
方法中正常工作。 也許這個問題與線程有關。
您在這里遇到線程問題。
您的代碼基於不是線程安全的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
單獨方法中。
這應該工作。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.