使用ContentProvider的AsyncQueryHandler是必要的吗?

时间:2015-09-22 09:21:10

标签: android android-contentprovider crud

我的问题非常简单:如果我通过UIThread中的ContentProvider插入或更新或删除SQLLite数据库中的单行,是否需要AsyncQueryHandler的实现?

我知道最好的做法是在异步任务中实现CRUD操作,但是关于一行的CRUD注释也不会太重。 事实上,Android Studio也不会提醒他不应该在UI线程上运行,并且我在网上找到的有关ContentProvider的所有指南都没有提到ASyncQueryHandler。所有CRUD操作都是在直接调用ContentProvider的UI线程上执行的。

1 个答案:

答案 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

}