Articles of android loader

使用CursorLoader在填充列表视图之前显示进度指示器

在我的列表视图没有填充数据库数据时,有什么更好的方法来显示进度指示器? 我find了一些使用assynctask的方法,但在我的例子中,我使用的是Loader / CursorLoader 。 public class TestActivity extends SherlockFragmentActivity implements LoaderCallbacks { SimpleCursorAdapter mAdapter; ListView mListView; private static final String[] UI_BINDING_FROM = new String[] { TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON }; private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_Test); mListView = (ListView) findViewById(R.id.listview); mAdapter = […]

使用自定义Loader时,未在ViewPager片段上调用onResume()

简洁版本: 我有一个片段,维护一个ViewPager来显示另外两个片段,我们称之为FragmentOne和FragmentTwo 。 启动应用程序时, FragmentOne可见, FragmentTwo处于屏幕外,只有在向左滑动视图时才可见。 通常,只要应用程序启动,就会立即为两个片段调用onStart()和onResume() 。 我遇到的问题是当FragmentOne启动一个自定义Loader然后在FragmentTwo调用onResume()直到它完全可见。 问题: 这是我的代码问题还是Android支持库中的错误? (该库的修订版12没有出现问题,它从修订版13开始。) 如果它是修订版13和18中的错误,是否有解决方法? 我的自定义Loader吗? 长版: 我已经构建了一个演示该问题的示例应用程序。 我试图将代码减少到最低限度,但它仍然很多,所以请耐心等待。 我有一个MainActivity ,可以加载一个创建ViewPager 。 对于我的应用程序来说,ViewPager由Fragment而不是Activity维护是很重要的。 MainFragment创建一个FragmentPagerAdapter ,然后创建片段FragmentOne和FragmentTwo 。 让我们从有趣的位开始,两个片段: FragmentOne是一个ListFragment ,它使用自定义Loader加载内容: public class FragmentOne extends ListFragment implements LoaderCallbacks<List> { private ArrayAdapter adapter; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1); setListAdapter(adapter); setEmptyText(“Empty”); } @Override public […]

当一个活动因配置更改而被销毁时,它的Loaders也会被销毁吗?

从装载机的开发者指南 , 在配置更改后重新创建时,它们会自动重新连接到最后一个加载器的光标 。 因此,他们不需要重新查询他们的数据。 在这篇关于装载机的博文中 , 当一个Activity被销毁时,Activity指示其LoaderManager销毁并关闭它的Loaders(以及与它们相关的任何资源,例如Cursor )。 问题是哪一个是正确的? 当一个活动因配置改变而被破坏时,(1)其Loaders(2)与其Loaders相关的资源(如Cursor )会发生什么。

告诉Android AsyncTaskLoader以检索更多数据

首先让我说这不是关于滚动ListViews的问题。 我不想知道如何判断用户何时滚动到列表的底部,所以请不要给我这个问题的答案,或将其标记为重复。 我正在使用一个扩展AsyncTaskLoader的类来使用来自Web服务的数据填充ListView。 最初,我加载了50个项目,一切都很好。 我需要知道如何告诉Loader以递增方式加载下50个项目。 我理解在ListView代码中要执行此操作,但我无法找出告诉Loader我想要加载更多数据而不重置它并再次加载所有内容的最佳方法 。 再说一次,澄清一下,我在这里要解决的问题只是通知加载器需要加载更多数据。 它已经知道如何在第二次调用loadInBackground()时加载更多数据,并且ListView已经知道何时/何时通知Loader,问题是如何 。 一些相关代码: @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); m_adapter = new SearchAdapter(getActivity()); setListAdapter(m_adapter); // if the loader doesn’t already exist, one will be created // otherwise the existing loader is reused so we don’t have // to worry about orientation and other configuration changes getLoaderManager().initLoader(SEARCH_LOADER_ID, […]

Android – onLoadFinished没有调用

我正面临着Loader的问题。 我有一个Activity,它显示从本地DB检索的记录列表。 活动开始时,将通过LoaderManager.initLoader()方法自动加载记录。 还可以通过ActionBarSherlock中的刷新按钮手动刷新列表。 但是,在完成另一个向DB添加记录的活动之后,不会调用onLoadFinished。 我正在使用SimpleCursorLoader ,这里是活动的代码片段: @Override public void onStart() { … getSupportLoaderManager().initLoader(0, null, this); } @Override public void onPause() { … getSupportLoaderManager().destroyLoader(0); } public void refreshRecords() { getSupportLoaderManager().restartLoader(0, null, this); } @Override public Loader onCreateLoader(int id, final Bundle args) { Loader l = new SimpleCursorLoader(this) { @Override public Cursor loadInBackground() { return recordDAO.getCursor(); […]

Android Fragment – 使用activity的loadermanager而不是Fragment的。 好吗?

给定一个使用加载器从数据库加载(大量)数据的片段。 问题: 我有一个寻呼机适配器,当用户离开拿着它的标签时会破坏该片段,并在用户返回该标签时重新创建它。 由于这种重新创建,每次都会创建一个新的加载器,并且每次都会加载数据。 题 : 为了避免每次创建片段时重新创建加载器,是否可以在片段的onActivityCreated方法中使用getActivity.getSupportLoaderManager.initLoader(loaderId, null, false) ? 我试过它,测试它,似乎工作正常。 但我不相信这是对的。

Loader:onLoadFinished只调用一次

我在一个活动中使用了一个加载器。 我能够启动加载器并调用onLoadFinished。 当我更新数据并在加载器中调用onContentChanged时,我看到loadInBackground和deliverResult都被调用。 这是小道似乎停止的地方。 我没有收到onLoadFinished任何回调。 如果我重新创建活动(也就是方向更改或重新启动),那么它将以相同的方式运行。 我正在使用support-v4加载器和加载器管理器。 我的SharedPreferenceLoader基于CommonsWare的加载器 : public class SharedPreferencesLoader extends AsyncTaskLoader implements SharedPreferences.OnSharedPreferenceChangeListener { private SharedPreferences prefs = null; private static final String TAG = SharedPreferencesLoader.class.getSimpleName(); public SharedPreferencesLoader(Context context) { super(context); } @Override public SharedPreferences loadInBackground() { Log.v(TAG, “wol: load in background”); prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); prefs.registerOnSharedPreferenceChangeListener(this); return (prefs); } @Override protected void […]

数据库更改发生后更新UI的方法

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

如何实现简单的AsyncTaskLoader?

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

为什么在片段恢复后再次调用onLoadFinished?

我对装载机有一个特殊的问题。 目前我不确定这是否是我的代码中的错误或我误解了加载器。 该应用程序 问题出现在对话中(想象类似于Whatsapp的东西)。 我使用的加载器是基于AsyncTaskLoader示例实现的 。 我正在使用支持库。 在OnCreate中,我启动一个加载器来检索缓存的消息。 当CachedMessageLoader完成时,它启动RefreshLoader以检索(在线)最新消息。 每个加载器types作为不同的ID(例如,离线:1在线:2) 这非常有效,但有以下例外。 问题 当我打开另一个片段(并将事务添加到backstack)然后使用Back-Key返回conversationFragment时,再次使用之前的两个结果调用onLoadFinished 。 此调用发生在片段有机会再次启动加载器之前… 我之前获得的“旧”结果的传递导致重复的消息。 题 为什么这些结果再次传递? 我是否错误地使用这些装载机? 我可以“使结果无效”以确保我只将它们送到一次或者我必须自己消除重复吗? 堆栈跟踪的电话 MyFragment.onLoadFinished(Loader, Result) line: 369 MyFragment.onLoadFinished(Loader, Object) line: 1 LoaderManagerImpl$LoaderInfo.callOnLoadFinished(Loader, Object) line: 427 LoaderManagerImpl$LoaderInfo.reportStart() line: 307 LoaderManagerImpl.doReportStart() line: 768 MyFragment(Fragment).performStart() line: 1511 FragmentManagerImpl.moveToState(Fragment, int, int, int, boolean) line: 957 FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1104 […]