簡體   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