既然Honeycomb
又v4 Compatibility Library
可以使用AsyncTaskLoader
.据我所知,它AsyncTaskLoader
可以通过配置更改生存,如屏幕翻转.
是否建议使用AsyncTaskLoader
而不是AsyncTask
?是否LoaderManager
也参与其中?
但我没有找到任何关于如何正确使用的好例子AsyncTaskLoader
.文档也没有提供任何示例.谁能提供一些很好的例子.
关于initLoader
以下restartLoader
功能之间的差异,我完全迷失了LoaderManager
:
restartLoader
还会创建一个加载器(如果它不存在)("在此管理器中启动新的或重新启动现有的加载器"). 两种方法之间是否存在某种关系?打电话restartLoader
总是打电话initLoader
吗?我可以打电话restartLoader
而不必打电话initLoader
吗?是否保存以调用initLoader
两次刷新数据?我什么时候应该使用其中一个而且(重要的!)为什么?
对我来说,如果您有多个装载机,如何获得正确的光标并不清楚.让我们说你定义了两个不同的Loader:
getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);
Run Code Online (Sandbox Code Playgroud)
然后在onCreateLoader()中你根据id做不同的事情:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
if (id==0){
CursorLoader loader = new CursorLoader(getActivity(),
MaterialContentProvider.CONTENT_URI,null,null,null,null);
}else{
CursorLoader loader = new CursorLoader(getActivity(),
CustomerContentProvider.CONTENT_URI,null,null,null,null);
};
return loader;
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是如何在onLoadFinished()中获得正确的光标,因为你没有得到任何id来识别正确的Cursoradapter光标.
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
mycursoradapter1.swapCursor(cursor);
if(isResumed()){
setListShown(true);
}else {
setListShownNoAnimation(true);
}
}
//and where to get the cursor for mycursoradapter2
Run Code Online (Sandbox Code Playgroud)
或者我错了,这是在一个片段中获得两个不同cursoradapter的结果的错误方法.
Android SDK文档说该startManagingCursor()
方法已被删除:
不推荐使用此方法.改为使用新的CursorLoader类和LoaderManager; 这也可以通过Android兼容包在旧版平台上使用.此方法允许活动根据活动的生命周期为您管理给定的Cursor生命周期.也就是说,当活动停止时,它将自动调用给定Cursor上的deactivate(),稍后重新启动它将为您调用requery().当活动被销毁时,所有托管游标将自动关闭.如果您的目标是HONEYCOMB或更高版本,请考虑改为使用LoaderManager,可通过getLoaderManager()获取
所以我想用CursorLoader
.但是当我在构造函数中需要URI时,如何使用自定义CursorAdapter
和不使用它?ContentProvider
CursorLoader
android cursor android-contentprovider android-loadermanager android-cursorloader
我是Android上的新手,我正在开发一个简单的应用程序来获得一些基本的体验.我的应用程序非常简单,包括广播接收器和一些活动.这两个组件都使用单个数据库,因此从理论上讲,两者都可能同时尝试访问数据库.
目前我只是在每次需要时实例化db对象(它是一个SQLite数据库帮助程序类),并执行所需的操作:查询,插入等.
从我在这里和其他一些文档中读到的,这有一个问题是在同时访问db的情况下获得"db locked"异常,所以更好的方法是拥有这个db对象的单个实例所以所有组件始终使用相同的数据库连接.
以上推理是否正确?那么一个单身人士会成为一个足够好的解决方案吗?我知道一些纯粹主义者可能反对它,但请注意,这是一个相当简单的应用程序,所以我可以负担得起在其他情况下我不会做的事情.
否则,更好的选择是什么?我已经阅读过有关使用内容提供商的内容,但这对此来说太过分了,除此之外我对与其他活动共享数据不感兴趣.我确实读过这篇文章,发现它很有帮助.
我在遵循Android中使用SQLite 的指南时遇到了麻烦.我正在使用a ListFragment
而不是ListActivity
(如示例中所示),所以我使用了ListFragment
工具LoaderManager.LoaderCallbacks<Cursor>
.然后,在以下fillData()
方法中ListFragment
:
private void fillData() {
// Fields from the database (projection)
// Must include the _id column for the adapter to work
String[] from = new String[] { NotesSQLiteHelper.COLUMN_TITLE };
// Fields on the UI to which we map
int[] to = new int[] { R.id.label };
getLoaderManager().initLoader(0, null, this); //error
adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.notes_row, null, from, to, 0);
setListAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
The method …
Run Code Online (Sandbox Code Playgroud) 我知道这已经讨论过但我想问一下目前的情况.我是否必须创建一个ContentProvider以将CursorLoader与sqlite数据库结合使用?
我发现
没有ContentProvider的CursorLoader用法
正如Emmby评论的那样,看起来正是我所希望的
因此提到了另一种解决方案
https://github.com/commonsguy/cwac-loaderex
还指出了一些缺点
当然,在使用LoaderManager时,我们希望获得它所引入的所有好处.所以我的问题是,如果有一种方法可以使用LoaderManager连接sqlite数据库,而无需实现内容提供程序,但具有它的所有好处.
谢谢
sqlite android android-contentprovider android-loadermanager
我创建了一个小应用程序,试图理解LoaderManager
和CursorLoader
-classes 的功能.
我已经实现了LoaderCallbacks<Cursor>
我的FragmentActivity
-class,一切工作正常,但事实上,当我通过我的更新数据ContentResolver.update()
或ContentResolver.insert()
-方法,onLoadFinished()
不叫,结果我的数据不会更新.
我有一个自定义ContentProvider,我想知道问题是在我的ContentProvider中没有通知数据已更改或其他内容.
android android-contentprovider android-loadermanager android-cursorloader
我有一个使用自定义Loader和Cursor设置的数据加载系统,它在Activities和Fragments中工作得很好但是在Service中没有LoaderManager(我可以找到).有谁知道为什么LoaderManager被排除在服务之外?如果没有办法解决这个问题?
android android-service android-fragments android-loadermanager
将单个SQLiteOpenHelper实例作为子类应用程序的成员,并且所有需要SQLiteDatabase实例的活动从一个帮助程序获取它是否可以?