片段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);
会阻塞mNameCache
直到mNameCache.put(callId, nameHolder);
. 但是文档说“ConcurrentHashMap”不会阻止检索操作。我不知道出了什么问题。