Articles of android loader

AsyncTaskLoader onLoadFinished有待处理的任务和配置更改

我正在尝试使用AsyncTaskLoader在后台加载数据以填充详细信息视图以响应所选的列表项。 我得到它主要工作,但我仍然有一个问题。 如果我在列表中选择第二个项目,然后在第一个选定项目的加载完成之前旋转设备,则onLoadFinished()调用将向正在停止的活动报告而不是新活动。 这在选择单个项目然后旋转时工作正常。 这是我正在使用的代码。 活动: public final class DemoActivity extends Activity implements NumberListFragment.RowTappedListener, LoaderManager.LoaderCallbacks { private static final AtomicInteger activityCounter = new AtomicInteger(0); private int myActivityId; private ResultFragment resultFragment; private Integer selectedNumber; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myActivityId = activityCounter.incrementAndGet(); Log.d(“DemoActivity”, “onCreate for ” + myActivityId); setContentView(R.layout.demo); resultFragment = (ResultFragment) getFragmentManager().findFragmentById(R.id.result_fragment); getLoaderManager().initLoader(0, […]

自定义CursorLoader和支持ListView的CursorAdapter之间的数据不同步

背景: 我有一个自定义CursorLoader ,它直接与SQLite数据库一起使用,而不是使用ContentProvider 。 此加载器使用由CursorAdapter支持的ListFragment 。 到现在为止还挺好。 为了简化操作,我们假设UI上有一个Delete按钮。 当用户单击此onContentChanged() ,我从DB中删除一行,并在我的加载器上调用onContentChanged() 。 另外,在onLoadFinished()回调中,我在我的适配器上调用notifyDatasetChanged()以刷新UI。 问题: 当删除命令快速连续发生时,意味着快速连续调用bindView() , bindView()最终将使用陈旧数据 。 这意味着行已被删除,但ListView仍在尝试显示该行。 这导致了Cursorexception。 我究竟做错了什么? 码: 这是一个自定义的CursorLoader(基于Diane Hackborn女士的建议 ) /** * An implementation of CursorLoader that works directly with SQLite database * cursors, and does not require a ContentProvider. * */ public class VideoSqliteCursorLoader extends CursorLoader { /* * This […]

发生数据库更改后更新用户界面的方法

我正在使用第一种方法开发基于Google IO演示架构的应用程序。 基本上我有一个Service ,由SQLite DB支持的ContentProvider ,我也使用Loader 。 当我的数据库发生更改时,我需要一种更新UI的方法。 例如,用户可能想要将物品添加到他的篮子中。 将物品ID插入购物篮表后,我想更新UI。 我应该用什么方法? 到目前为止,我在ContentObserver上看到的信息很less。 这是要走的路吗?

我怎样才能实现一个简单的AsyncTaskLoader?

在我最近的一个SO问题中,有人build议我使用Loader来解决问题。 所以在这里我想了解如何实现一个简单的AsyncTaskLoader 以下是我想到的: public class Scraper extends AsyncTaskLoader<List<Event>> { List<Event> lstEvents; public Scraper(Context context) { super(context); } public List<Event> loadInBackground() { //This is where I will do some work and return the data } } 这就是我所想到的。 我阅读了AyncTaskLoader的文档,但是我从来没有遇到过如此神秘而杂乱的东西。 有一百万种方法,所有这些方法都是相互矛盾的,看着它们,不可能推断出它们被调用的顺序,甚至是否应该被重写和调用。 这个任务的生命周期是一个该死的噩梦。 我正在寻找的是只是刮一些数据,并返回它。 我也想将它存储在一个类variables中,以便下一次及时返回而不必再次擦除所有的数据。 我没有打开的游标,stream或类似的东西,只是一个简单的variables,称为lstEvents (可能很大)。 我不想泄漏内存和浪费资源,所以我会很高兴,如果有人能解释什么我需要closures/取消何时何地得到这个任务工作。 我应该在哪里存储数据到类variables? Shoudl我在我的loadInBackground方法结束时,或者我应该在deliverResult方法中做到这一点? 在这个简单的场景中,是否真的需要检查任务是否被取消或是否被重置,或者我应该不重写这些方法,并让AsyncTaskLoader处理它。 如果有人知道,一些脚手架代码将是有帮助的。 万分感谢。

除了提前调用cursor.close()之外,什么会导致StaleDataException?

我目前正在大量修改/重写一个Android应用程序,并且我看到了一个非常偶然的崩溃: CursorAdapter方法被调用,它调用AbstractWindowedCursor#checkPosition()和: 02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method. 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220) 麻烦的是,我们没有closures任何Cursor 。 我们所有的Cursor都来自CursorLoader ,并由ContentProvider 。 我们将Cursor从LoaderCallbacks传递到每个相应的CursorAdapter ,我们在ContentProvider注册Cursor来通知,我们从每个insert(…) , delete(…)和update(…) delete(…) 通知 ContentResolver 。 […]

Android Loader不会触发屏幕上的callback

我正在使用一个AsyncTaskLoader 。 我有一个已经实现LoaderCallbacks (支持库)的活动。 我有断点debugging,并放入日志,加载器提供结果,但第二次onLoadFinishedcallback没有触发。 奇怪的是,当我再次旋转时,它会起作用,当我回到起始位置时,从哪个方向开始callback。 在我的活动onResume : LoaderManager lm = getSupportLoaderManager(); Loader loader = lm.initLoader(0, null, new LoaderManager.LoaderCallbacks<String>() { @Override public Loader<String> onCreateLoader(int i, Bundle bundle) { Loader<String> loader = new TestLoader(MainActivity.this); return loader; } @Override public void onLoadFinished(Loader<String> stringLoader, String s) { Log.d(Application.TAG, "OnLoadFinished " + s); doStuff(s); } @Override public void onLoaderReset(Loader<String> […]

Android Volley + Loader模式?

我有点喜欢Volley框架,但是我仍然有一些疑虑。 例如,Volley如何排列Loader模式? 由于它的请求是以asynchronous的方式处理的,所以在后台调用它没有什么意义。 另一方面,如果我们忽略Loader模式,我们将取消加载并重新加载必要的资源,这是有点浪费。 Volley框架如何在Android中使用Loaders?

LoaderManager的范围是什么?

当使用Loaders创buildAndroid应用程序时,每个活动和片段是否都有自己的LoaderManager ? 或者应该只有一个应用程序拥有的LoaderManager ? 最后,是用于识别在类之外可见的特定LoaderManager的“唯一ID”吗? 具体来说,我无法决定应用程序中哪些类应该实现LoaderCallback<Cursor>方法(即每个片段应该实现这些callback,还是应该有一个片段实现callback并查询结果,将它们发送到其他片段/必要的活动)? 在此先感谢任何能够帮助我的人! 我无法find关于这个在线的太多的信息。

全局加载器(LoaderManager)在多个活动/片段中重用

我想实现的是: 我有两个不同的片段。 我希望他们都以两种forms(列表和地图)显示相同的数据。 我希望他们共享一个Loader(特别是AsyncTaskLoader )。 一切工作正常,但装载机不被重新使用。 另一个是创build和数据加载两次。 我做的事: 在Fragment我使用LoaderManager lm = getActivity().getSupportLoaderManager(); 在他们两个我实现LoaderCallbacks<ArrayList<Item>>和所需的方法。 在这两个我使用lm.initLoader(0, args, this); 。 但是,当我输出lm.toString()它看起来这些是两个不同的装载机。 数据被下载两次。 如何从不同的Activity / Fragment中重新连接到相同的Loader? 这应该是可能的,因为无论如何onCreate()上下文被附加到Loader上,例如在configuration改变时。

支持ListView的自定义CursorLoader和CursorAdapter之间的数据不同步

背景: 我有一个自定义的CursorLoader直接与SQLite数据库,而不是使用ContentProvider 。 这个装载器与由CursorAdapter支持的ListFragment一起工作。 到现在为止还挺好。 为了简化事情,我们假设用户界面上有一个删除button。 当用户点击这个时,我从数据库中删除一行,并在我的装载器上调用onContentChanged() 。 另外,在onLoadFinished()callbacknotifyDatasetChanged()上,我调用适配器上的notifyDatasetChanged()以刷新UI。 问题: 当删除命令快速连续发生时,意味着onContentChanged()被快速的连续调用, bindView()最终将处理陈旧的数据 。 这意味着一行已被删除,但ListView仍在尝试显示该行。 这导致游标例外。 我究竟做错了什么? 码: 这是一个自定义的CursorLoader(基于Diane Hackborn女士的build议 ) /** * An implementation of CursorLoader that works directly with SQLite database * cursors, and does not require a ContentProvider. * */ public class VideoSqliteCursorLoader extends CursorLoader { /* * This field is private in […]