我有以下代码:
Cursor cursor = fetchAllPhoneNumbers();
mDb.beginTransaction();
while (cursor.moveToNext()) {
String contactId = cursor.getString(cursor
.getColumnIndex(DbAdapter.KEY_CONTACT_ID));
String phoneNo = cursor.getString(cursor
.getColumnIndex(DbAdapter.KEY_CONTACT_NO));
String key = contactId + "," + phoneNo;
String reg = map.get(key);
if (reg != null) {
updatePhoneNumbersIsRegistered(contactId, phoneNo,
reg, System.currentTimeMillis());
} else {
deletePhoneNumbersByContactDetail(contactId, phoneNo);
}
map.remove(key);
}
for (Map.Entry<String, String> pnEntry : map.entrySet()) {
String pnKey = pnEntry.getKey();
String pnValue = pnEntry.getValue();
String[] details = pnKey.split(",");
createPhoneNumber(details[0], details[1], pnValue,
System.currentTimeMillis());
}
cursor.close();
mDb.setTransactionSuccessful();
mDb.endTransaction();
在AsyncTask中运行此函数会导致我的ui线程挂起,直到函数完成,但如果我删除了开始,设置和结束事务,ui线程可以自由运行,任何想法为什么这是发生了还是有解决方法?当我放置交易代码时,这实际上提升了2分钟到20秒的性能。(请注意它是用于测试所以我没有做适当的尝试最终捕获以处理结束交易。)
答案 0 :(得分:2)
这回答了你的问题:
Sqlite transaction is blocking Android ui
基本上,UI线程上的某些东西试图读取数据库并且它会挂起。确保在后台线程运行时根本不执行数据库操作。
答案 1 :(得分:1)
我通常把这种东西放在IntentService
中,它运行在不同的线程上,然后使用Handler
处理服务和UI之间的通信。
答案 2 :(得分:0)
使用AsyncTask或实施线程来完成后台工作。