Articles of android loadermanager

Android:CursorLoader在非最顶层的Fragment上崩溃

我有一些使用CursorLoader检索其内容的ListFragments。 当用户向下钻取内容时,一个片段替换另一个片段(活动保持不变)。 但是如果内容在非最顶层的片段上发生变化,则应用程序崩溃: E/AndroidRuntime(18830): FATAL EXCEPTION: main E/AndroidRuntime(18830): java.lang.RuntimeException: Unable to resume activity {com.example.ExampleApp/com.example.ExampleApp.ExampleActivity}: java.lang.IllegalStateException: Content view not yet created E/AndroidRuntime(18830): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120) E/AndroidRuntime(18830): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135) E/AndroidRuntime(18830): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:957) E/AndroidRuntime(18830): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(18830): at android.os.Looper.loop(Looper.java:130) E/AndroidRuntime(18830): at android.app.ActivityThread.main(ActivityThread.java:3683) E/AndroidRuntime(18830): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(18830): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime(18830): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/AndroidRuntime(18830): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/AndroidRuntime(18830): at dalvik.system.NativeStart.main(Native Method) […]

LoaderManager.restartLoader()总是会调用onCreateLoader()吗?

LoaderManager有这个方法restartLoader() : public abstract Loader restartLoader (int id, Bundle args, LoaderCallbacks callback) 启动一个新的或重新启动此管理器中的现有Loader,将回调注册到它,并且(如果活动/片段当前已启动)开始加载它。 如果先前已启动具有相同id的加载器,则在新加载器完成其工作时将自动销毁该加载器。 回调将在旧的加载器被销毁之前传递。 基于开发指南 ,我认为实际上,对onCreateLoader的调用总是来自restartLoader() : 重新启动加载程序 … 要丢弃旧数据,请使用restartLoader()。 例如,当用户的查询更改时,SearchView.OnQueryTextListener的此实现会重新启动加载程序。 需要重新启动加载程序,以便它可以使用修订的搜索filter来执行新查询: public boolean onQueryTextChanged(String newText) { // Called when the action bar search text has changed. Update // the search filter, and restart the loader to do a new query // with this […]

Android Loader不会在屏幕旋转时触发回调

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

带有LoaderManager兼容包的ExpandableListFragment

我想让我的ExpandableListActivity与Honeycomb兼容。 我想知道为什么兼容包没有ExpandableListFragment。 有没有办法使ExpandableListView与普通的Fragment类一起工作? 如何使用LoaderManager加载游标?

使用CursorLoader查询SQLite DB并填充AutoCompleteTextView

我有一个我想查询的SQLite数据库。 我想通过ICS定位Android 2.2。 我遇到了关于如何执行此操作的文章,但它使用了弃用的代码(不是异步查询,而是在UI线程上)。 我已经读过,我可以使用CursorLoader和LoaderManager来执行此任务,这是首选的最佳实践方式(不会让UI线程陷入困境)。 问题是find一个简洁的例子向我解释如何做到这一点。 1)加载数据库,2)查询它,3)使用结果填充AutoCompletetextBox列表视图。 这样的例子存在吗?

为什么我的OnLocationChanged()永远不会被调用?

我想做什么: 我正在尝试开发一个只需要用户在一个活动开始时的位置的应用程序。 因此,只有当用户在活动中时,才能通过网络或GPS更新位置。 因此,用户可以选择室内地图。 我的问题是什么: 但是,我发现应用程序始终使用历史记录位置,并且从不更新位置。 我怀疑我的确有问题 location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) 但我不确定问题出在哪里。 相关代码片段: 在我的Activity ,我有: locationDetector = new LocationDetector(MapSelectionActivity.this); // try to get the current location if (locationDetector.checkLocationServiceAvailability()) { location = locationDetector.getLocation(); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } Log.d(“MapSelectionActivity”, latitude + ” ” + longitude); //locationDetector.stopLocalization(); // stop the localization […]

如何从managedQuery转换到LoaderManager / CursorLoader?

我正在开发一个针对API级别8(2.2,Froyo)的Android应用程序。 我正在使用ContentProvider ,这很简单,我正在使用SimpleCursorAdapter填写我的列表视图,但我在SimpleCursorAdapter的文档中注意到,不推荐使用以下注释的无标记构造函数: 不推荐使用此构造函数。 不鼓励使用此选项,因为它会导致在应用程序的UI线程上执行Cursor查询,从而导致响应能力较差甚至应用程序无响应错误。 作为替代方案,使用带有CursorLoader的LoaderManager。 由于我的目标是API级别8,因此LoaderManager与Activity无关。 兼容包中的FragmentActivity类执行此操作,但我没有使用Fragments。 我的问题是:我应该如何在针对11之前API级别的应用中使用LoaderManager/CursorLoader ? 我是否被迫转换到Fragments,或者我应该回到不推荐使用的SimpleCursorAdapter构造函数(但是使用AsyncTask来保持UI线程友好,这就是CursorLoader应该做的事情)?

是否应该使用Loaders访问Web服务?

据我所知,Loader框架适用于访问ContentProvider / SQLite数据库中本地存储的数据。 我们有CursorLoader类可以很好地处理这个用例。 但我想知道使用Loader框架编写扩展Loader / AsyncTaskLoader以访问远程Web服务(例如REST Web服务)的类是否切实可行? 我一直认为这个框架对于这个用例来说有点过于僵化和混乱(缺乏适当的文档)。 我更喜欢使用AsyncTasks / Services以更常规的方式处理REST调用。 但最近我发现一些使用AsyncTaskLoaders的文章并开始怀疑。 那么为什么有人会使用Loaders来访问Web服务呢? 我在这里看到的唯一优势是装载机自动保留其结果。 之后没有Cursor可以管理。

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

我想要实现的目标: 我有两个不同的片段。 我希望他们两个以两种forms(在列表和地图上)显示相同的数据。 我希望他们共享一个Loader(特别是AsyncTaskLoader )。 一切正常,但Loader不会被重复使用。 创建另一个并且数据加载两次。 我做的事: 在Fragment我使用LoaderManager lm = getActivity().getSupportLoaderManager(); 在这两个中,我实现了LoaderCallbacks<ArrayList>和所需的方法。 在两者中我使用lm.initLoader(0, args, this); 。 但是当我输出lm.toString()它们似乎是两个不同的lm.toString() 。 数据下载两次。 如何从不同的活动/片段重新连接到同一个Loader,而不是从它开始的那个? 它应该是可能的,因为无论如何在每个onCreate()上都将上下文附加到Loader,例如在配置更改时。

调用initLoader()后Loader没有启动?

我有一个片段,并且想要在单击按钮时启动加载器: public class MyFragment extends Fragment { public void onActivityCreated() { super.onActivityCreated(); Button btn = …; btn.setOnClickListener(new OnClickListener() { public void onClick(View view) { getLoaderManager().initLoader(500, null, mMyCallback); } }); } private LoaderManager.LoaderCallbacks mMyCallback = new LoaderManager.LoaderCallbacks() { @Override public Loader onCreateLoader(int arg0, Bundle arg1) { Log.e(TAG, “LoaderCallback.onCreateLoader().”); return new MyLoader(getActivity()); } } } public class […]