Articles of android loadermanager

startManagingCursor的目的是什么?

好的,文档声明它允许Activity管理游标的生命周期。 但是我没有真正看到它的重点,因为当活动被销毁时,对新创建的游标的任何引用也应该被删除,然后光标本身在下一个垃圾收集周期中就会死亡。 为什么要这么麻烦?

刷新片段内的视图

我搜索了很多看起来像这个问题的问题,但是没有find我的答案。 我有一个活动,通过操作栏可以访问3个选项卡。 我通过添加3个片段来实现这一点,这些片段会扩展我扩展视图类的自定义视图。 在数据库更改的那一刻,我尝试通过调用invalidate()/ postinvalidate()刷新我的选项卡中的视图,但这不起作用。 调用片段的onCreateView就像我考虑的其他选项一样。 然而,当我转到另一个选项卡然后返回时,已经进行了更改,并且我的视图会按原样更新。 如何模拟更改为另一个选项卡时发生的相同事情? 会发生什么 我试图查看Fragment生命周期(试图调用onCreateView())来解决它,但它只是不想刷新/重绘它应该。 正确加载数据,因为当我更改为另一个选项卡时数据会更改。 我删除了一些代码,因为它不再相关。 我实现了Cursorloaders而不是我自己的Observer模式来通知更改。 这是我现在的主要活动。 问题是,如果我想重绘这些片段中的视图,我现在应该怎么做。 如果我应用fragmentObject.getView()。invalidate()它不起作用。 我遇到了和以前一样的问题,但现在我的Observer通知加载器正确实现了数据库中的更改。 public class ArchitectureActivity extends Activity implements LoaderManager.LoaderCallbacks { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ActionBar actionbar = getActionBar(); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab EditTab = actionbar.newTab().setText(“Edit”); ActionBar.Tab VisualizeTab = actionbar.newTab().setText(“Visualize”); ActionBar.Tab AnalyseTab = actionbar.newTab().setText(“Analyse”); Fragment editFragment = new EditFragment(); […]

OnLoadFinished()调用了两次

我想弄清楚我是否在装载机方面做错了。 我正在使用支持库,我有一个片段,在onCreate()中调用initLoader()将其自身设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并传递结果,因为它已经拥有数据。 如果我只调用init一次(在第一次启动Fragment时),它不会将自己设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用。 好像onLoadFinished应该只调用一次,因为在onLoadFinished()中可以完成一些昂贵的事情(比如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init。 任何人都对此问题有任何见解?

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如何自动更新视图?

我一直在研究一个小的待办事项列表应用程序。 我使用CursorLoader从内容提供者更新ToDolistview。 我有一个函数onNewItemAdded() ,当用户在文本视图中输入一个新项并单击Enter时调用该函数。 参考下文: public void onNewItemAdded(String newItem) { ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(ToDoContentProvider.KEY_TASK, newItem); cr.insert(ToDoContentProvider.CONTENT_URI, values); // getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing } @Override protected void onResume() { super.onResume(); //getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing } public Loader onCreateLoader(int […]

CursorLoaders有什么好处?

我在我的应用程序中广泛使用Cursors ,以加载偶尔从数据库写入信息和向数据库写入信息。 我已经看到Honeycomb和兼容包具有新的Loader类,旨在帮助以“良好”的方式加载数据。 从本质上讲,这些新类(特别是CursorLoader )是否比以前管理数据的方法要好得多? 例如, CursorLoader比托管Cursors有什么好处? 我使用ContentProvider来处理数据,这显然需要Uris但是它如何与initLoader()方法相结合? 我必须设置每个Fragments以单独使用装载机吗? 并且每个加载器的id需要多么独特,它是在我的应用程序范围内还是仅仅是一个片段? 有没有简单的方法简单地将Uri传递给CursorLoader来查询我的数据? 我现在所能看到的是,Loaders添加了一个不必要的额外步骤来将我的数据导入我的应用程序,那么有人可以更好地向我解释它们吗?

在活动中初始化加载程序

我目前正在尝试学习如何使用Loaders,并且在我的活动中无法启动Loader。 import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; public class ASwitchActivity extends Activity implements LoaderManager.LoaderCallbacks { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getLoaderManager().initLoader(0, null, this); } public Loader onCreateLoader(int id, Bundle args) { return new SampleLoader(getBaseContext(), account, “dog”); } public void onLoadFinished(Loader loader, SampleLoader.SampleLoaderResult out) { TextView t=(TextView)findViewById(R.id.testTV); t.setText(“yay”); } public void onLoaderReset(Loader loader){ } } 但是Eclipse给出了一个错误说明: […]

自定义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 […]

我必须使用Fragments来获得LoaderManager吗?

根据一些文档,我可以在Activity或Fragment中使用Loader,但Compatibility Package显示只有FragmentActivity具有getLoaderManager()方法。 由于旧的托pipe游标已被弃用,我们必须使用光标加载器。 那么为什么这个数据pipe理function应该与UI小部件的select联系起来呢? 对我来说完全是无稽之谈。 谢谢P.

如何在android中的LoaderManager中使用两个游标和CursorJoiner

我有一个ContentProvider ,它有两个表1. OnlineContacts 2. AllContacts 。 然后我有一个方法,我在查询两个表,并分别得到他们的结果cursors 。 然后使用CursorJoiner join他们并制作Contacts列表。 将此列表传递给我的CustomAdapter extending BaseAdapter ,我填充我的listview 。 喜欢 : public static List<Contact> getContacts(Context context){ List<Contact> contactList = new ArrayList<Contact>(); // Getting First Cursor String URL = xyz; Uri baseUri1 = Uri.parse(URL); String[] select = xyz; String where =xyz; Cursor cursor = context.getContentResolver().query(baseUri1, select, where, null, "pid"); // […]