繁体   English   中英

Android-使用GCM的Recycler View

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM