【发布时间】:2017-04-27 17:17:47
【问题描述】:
我使用 applyBatch 对 SQLite 数据库进行插入、更新和删除操作,第一次安装应用程序和定期同步有超过 2000 个条目,由于对数据库应用程序的大量操作停止响应。 applyBatch 大约需要 30-40 秒才能完成。
我已经看到了解决方案 ContentResolver.bulkInsert (Uri url, ContentValues[] values) from Insertion of thousands of contact entries using applyBatch is slow
但它只用于插入操作,我有查询插入、更新和删除的组合。
我也尝试过使用 AsyncTask
private class InsertTask extends AsyncTask<ArrayList<ContentProviderOperation>, Integer, Void> {
@Override
protected Void doInBackground(ArrayList<ContentProviderOperation>... params) {
try {
providerClient.applyBatch(params[0]);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
谢谢。
【问题讨论】:
-
为什么 AsyncTask 没用?
-
使用 AsyncTask 后,它仍然会阻塞 UI 线程,并且在某些设备上的应用程序会停止响应
-
不可能...也许 ContentProvider 上的另一个操作会阻止它(例如:您运行此 AsyncTask,然后(在它结束之前)对它进行查询)
-
根据 contentProvider 执行每个操作后的行为,它 notifyChange()。是因为这个吗?
-
是的,这可能是一个原因...修改您的 applyBatch 以在完成之前不执行此操作,当您使用默认实现时可能会很棘手,因为它在内部调用 insert/update/delete
标签: android multithreading sqlite android-contentprovider