Articles of android loader

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

我正在使用第一种方法开发基于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 […]

何时使用Android Loaders

装载机 监视数据源并提供新的结果 configuration更改后:不需要重新查询数据 我阅读关于装载机的Android指南。 我读了Alex Lockwood 4部分教程 。 testing了他的示例应用程序 。 试图阅读谷歌应用程序的I / O 13,有一个streamfunction,并阅读其代码发现它使用StreamLoader程序,因为它提供的代码来创build一个StreamLoader 。 这里是链接,我想他们用它来监视新的数据,并将其添加到他们的观点。 亚历克斯的应用程序相同。 有一个观察者,当有新的数据项触发UI的刷新。 到目前为止,在我看来,装载机是“livescore”应用程序的理想select。 当有一个新的更新(这意味着一个新的数据input),它会出现在你的屏幕上。 也许像Twitter一样。 为您的新消息,自定义Observer注意到的变化,自定义Loader带来的数据和一个适配器来显示它们。 没有必要“拉到刷新”。 但是,Twitter又拥有自己的RESTful API,这也是同样的工作。 不需要指向新数据的指针。 (不知道他们是怎么做的,但我想不知怎么“推”新的数据到你的设备)。 所以我的问题是: 当我们想要观察一个数据源并改变我们的视图,装载机是最好的select,所以它会显示新的数据? 是否有任何示例/应用程序,我可以检查处理该逻辑:监视数据源 – >获取数据 – >刷新用户界面 任何特殊的情况下(比如我之前提到的“livescore”),当我们必须处理它们时,我们必须selectLoaders? 装载机的第二部分(configuration更改,保存数据)我觉得很清楚。 没有人想要在用户旋转设备时重新下载图片库。 谢谢你,原谅我的困惑

AsyncTaskLoader onLoadFinished与一个挂起的任务和configuration改变

我试图使用AsyncTaskLoader在后台加载数据来填充一个详细视图,以响应select的列表项。 我已经得到它主要工作,但我仍然有一个问题。 如果我在列表中select第二个项目,然后在第一个选定项目的加载完成之前旋转设备,则onLoadFinished()调用将报告被停止的活动,而不是新活动。 这个工作正常,当select一个单一的项目,然后旋转。 这是我正在使用的代码。 活动: public final class DemoActivity extends Activity implements NumberListFragment.RowTappedListener, LoaderManager.LoaderCallbacks<String> { 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, […]