スニペット 1:
private void startLoadingName() {
for (ConcurrentHashMap.Entry<TextView, Long> entry : mPendingNameRequest.entrySet()) {
long callId = (Long)entry.getValue();
NameHolder nameHolder = mNameCache.get(callId);
nameHolder.name = QueryUtils.loadNameFromDb(mContext, callId);
nameHolder.status = NameHolder.LOADED;
// mNameCache is a ConcurrentHashMap
mNameCache.put(callId, nameHolder);
updateContactCachedName(callId, nameHolder);
}
GsItemLoader.this.sendEmptyMessage(MESSAGE_SET_NAME);
}
このスニペットは、UI スレッド以外のスレッドで実行されます。実行するたびに、ListView のスクロールは常に遅くなるため、スニペットには UI スレッドをブロックする何かが必要です。
までNameHolder nameHolder = mNameCache.get(callId);
ブロックすることがわかりました。しかし、ドキュメントによると、「ConcurrentHashMap」は検索操作でブロックされません。何が問題なのかわかりません。mNameCache
mNameCache.put(callId, nameHolder);