我的问题非常简单:如果我通过UIThread中的ContentProvider插入或更新或删除SQLLite数据库中的单行,是否需要AsyncQueryHandler的实现?
我知道最好的做法是在异步任务中实现CRUD操作,但是关于一行的CRUD注释也不会太重。 事实上,Android Studio也不会提醒他不应该在UI线程上运行,并且我在网上找到的有关ContentProvider的所有指南都没有提到ASyncQueryHandler。所有CRUD操作都是在直接调用ContentProvider的UI线程上执行的。
答案 0 :(得分:1)
最好只为所有ContentProvider操作转到Async路由。我知道这可能是一种痛苦,但请考虑一下:
简单的单行插入通常需要几毫秒才能完成更大的事务处理。也许你忙于在SyncAdapter中做很多事情?你的小插件突然需要更长时间,甚至可能导致ANR。
我知道这是一个非常低的机会,但机会仍然存在。最好只接受样板代码并继续使用它; - )
要粘贴到活动类中的示例样板代码:
private class UpdateHandler extends AsyncQueryHandler {
private final WeakReference<YourActivityClass> mActivityRef;
public UpdateHandler(YourActivityClass activity, ContentResolver cr) {
super(cr);
mActivityRef = new WeakReference<>(activity); // do a weak reference incase the update takes ages and the activity gets destroyed during
}
@Override
protected void onUpdateComplete(int token, Object cookie, int result) {
super.onUpdateComplete(token, cookie, result);
YourActivityClass exampleActivity = mActivityRef.get();
if (exampleActivity != null) {
exampleActivity .onUpdateCompleted(token);
}
}
}
public void saveStuffToDatabase() {
// do some stuff like show a progress bar or whatever
// actually do the update operation
new UpdateHandler(this, getContentResolver()).startUpdate(
0, // this will be passed to "onUpdatedComplete" in the updateHandler
null, // so will this!
uri,
values
);
}
private void onUpdateCompleted(int token) {
// this runs in the main thread after the update you started in saveStuffToDatabase() is complete
}