[英]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.