标签: android-loadermanager

如何从managedQuery转换到LoaderManager/CursorLoader?

我正在开发一个针对API级别8(2.2,Froyo)的Android应用程序.我正在使用a ContentProvider,这很简单,我正在使用SimpleCursorAdapter填写我的列表视图,但我在SimpleCursorAdapter的文档中注意到,不推荐使用以下注释的无标记构造函数:

不推荐使用此构造函数.不鼓励使用此选项,因为它会导致在应用程序的UI线程上执行Cursor查询,从而导致响应能力较差甚至应用程序无响应错误.或者,使用带有CursorLoader的LoaderManager.

由于我的目标是API级别8,因此a LoaderManager不依赖于Activity.FragmentActivity兼容包中的类执行此操作,但我没有使用Fragments.

我的问题是:我应该如何LoaderManager/CursorLoader在针对11级以前API级别的应用中使用它?我是否被迫转换为Fragments或者我应该恢复到已弃用的SimpleCursorAdapter构造函数(但是使用一个AsyncTask来保持UI线程友好,这CursorLoader应该是什么)?

java android simplecursoradapter android-fragments android-loadermanager

15
推荐指数
1
解决办法
2万
查看次数

使用CursorLoader查询SQLite DB并填充AutoCompleteTextView

我有一个我想查询的SQLite数据库.我想通过ICS定位Android 2.2.我遇到了关于如何执行此操作的文章,但它使用了弃用的代码(不是异步查询,而是在UI线程上).我已经阅读过,我可以使用CursorLoaderLoaderManager来执行此任务的首选,最佳实践方式(以免陷入UI线程).

问题是找到一个简洁的例子向我解释如何做到这一点.1)加载数据库,2)查询它,3)使用结果填充AutoCompletetextBox列表视图.

这样的例子存在吗?

sqlite android android-loadermanager android-cursorloader

15
推荐指数
1
解决办法
5840
查看次数

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

据我所知,Loader框架适用于访问ContentProvider/SQLite数据库中本地存储的数据.我们有CursorLoader类可以很好地处理这个用例.

但我想知道使用Loader框架编写扩展Loader/AsyncTaskLoader以访问远程Web服务(例如REST Web服务)的类是否切实可行?我一直认为这个框架对于这个用例来说有点过于僵化和混乱(缺乏适当的文档).我更喜欢使用AsyncTasks/Services以更常规的方式处理REST调用.但最近我发现一些使用AsyncTaskLoaders的文章并开始怀疑.

那么为什么有人会使用Loaders来访问Web服务呢?我在这里看到的唯一优势是装载机自动保留其结果.之后没有Cursor可以管理.

android android-loadermanager android-loader

15
推荐指数
1
解决办法
7651
查看次数

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

LoaderManager有这个方法restartLoader():

public abstract Loader<D> restartLoader (int id, Bundle args, LoaderCallbacks<D> callback)

在此管理器中启动新的或重新启动现有的Loader,向其注册回调,并且(如果活动/片段当前已启动)开始加载它.如果先前已启动具有相同id的加载器,则在新加载器完成其工作时将自动销毁该加载器.回调将在旧的加载器被销毁之前传递.

基于开发指南,我得到的结论是,确实,调用onCreateLoader将始终来自restartLoader():

重新启动加载程序

...

要丢弃旧数据,请使用restartLoader().例如,当用户的查询更改时,SearchView.OnQueryTextListener的此实现会重新启动加载程序.需要重新启动加载程序,以便它可以使用修订的搜索过滤器来执行新查询:

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 filter.
    mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
    getLoaderManager().restartLoader(0, null, this);
    return true;
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // NOTE: …
Run Code Online (Sandbox Code Playgroud)

android android-loadermanager android-loader

15
推荐指数
1
解决办法
1万
查看次数

弃用的getSupportLoaderManager的适当替代者是什么?

我在Android Studio中获得了不推荐使用getSupportLoaderManager的信息.但是我想打个电话:

getSupportLoaderManager().initLoader(0, null, mRecipeLoaderManager);
Run Code Online (Sandbox Code Playgroud)

该电话的替代方案应该是什么?或者我仍然可以使用getSupportLoaderManager而不用担心?

android loader asynctaskloader android-loadermanager

15
推荐指数
5
解决办法
1万
查看次数

带有LoaderManager兼容包的ExpandableListFragment

我想让我的ExpandableListActivity与Honeycomb兼容.我想知道为什么兼容包没有ExpandableListFragment.

有没有办法使ExpandableListView与普通的Fragment类一起工作?如何使用LoaderManager加载游标?

android expandablelistview android-fragments android-loadermanager android-support-library

14
推荐指数
2
解决办法
1万
查看次数

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

我有一些使用CursorLoader检索其内容的ListFragments.当用户向下钻取内容时,一个Fragment替换另一个(Activity保持不变).但如果内容在非最顶层的片段上发生变化,则应用程序崩溃:

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)
E/AndroidRuntime(18830): Caused by: java.lang.IllegalStateException: Content view not yet created
E/AndroidRuntime(18830):        at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
E/AndroidRuntime(18830):        at android.support.v4.app.ListFragment.setListShown(ListFragment.java:280)
E/AndroidRuntime(18830):        at android.support.v4.app.ListFragment.setListShownNoAnimation(ListFragment.java:266)
E/AndroidRuntime(18830):        at com.example.ExampleApp.FirstListFragment.onLoadFinished(FirstListFragment.java:102)
E/AndroidRuntime(18830):        at com.example.ExampleApp.FristListFragment.onLoadFinished(FirstListFragment.java:20)
E/AndroidRuntime(18830):        at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:414) …
Run Code Online (Sandbox Code Playgroud)

android cursor android-fragments android-loadermanager

14
推荐指数
1
解决办法
2530
查看次数

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

我正在使用AsyncTaskLoader.我有一个已经实现的活动LoaderCallbacks(支持库).

我有断点调试并放入日志,加载器传递结果,但是第二次onLoadFinished没有触发回调.奇怪的是 - 当我再次向后旋转时它起作用,当我回到它时,我开始的方向会得到回调.

在我的活动中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> stringLoader) {
            // NOP
        }
    });
Run Code Online (Sandbox Code Playgroud)

在我的装载机:

public class TestLoader extends AsyncTaskLoader<String> {
    private String mData;

    public TestLoader(Context context) { …
Run Code Online (Sandbox Code Playgroud)

android android-loadermanager android-loader

14
推荐指数
1
解决办法
4069
查看次数

如何设置CursorAdapter(Context context,Cursor c,int flags)以使其与CursorLoader一起使用?

谷歌文档指出不使用第CursorAdapters一个构造函数,

CursorAdapter(Context context, Cursor c)
Run Code Online (Sandbox Code Playgroud)

只有两个选项,

CursorAdapter(Context context, Cursor c, boolean autoRequery)
Run Code Online (Sandbox Code Playgroud)

这说

允许控制自动重新查询的构造函数.建议您不要使用它,而是使用CursorAdapter(Context,Cursor,int).使用此构造函数时,将始终设置FLAG_REGISTER_CONTENT_OBSERVER

CursorAdapter(Context context, Cursor c, int flags)`
Run Code Online (Sandbox Code Playgroud)

这说它是推荐的构造函数.

问题是这里只有两个标志用于最后一个构造函数,FLAG_AUTO_REQUERY(int 1)和FLAG_REGISTER_CONTENT_OBSERVER(int 2).使用FLAG_AUTO_REQUERY没有意义,因为我现在使用CursorLoader在后台管理它并更新它.有FLAG_REGISTER_CONTENT_OBSERVER,它表示使用时不需要CursorLoader.

现在我问,我通过什么整数CursorAdapter(Context context, Cursor c, int flags)才能使它与我的工作正常CursorAdapter?让我担心的是如何正确管理旧光标.我不确定这样做的正确方法.

如果我使用FLAG_REGISTER_CONTENT_OBSERVER,那么我必须做一些事情onContentChanged(),但swapCursor()在我使用时LoaderManager,由于光标未关闭,我可以做adapter.swapCursor(cursor).close().但会与冲突onContentChanged()CursorAdapter?目标是不会导致任何内存泄漏并且效率很高.

android android-contentprovider android-loadermanager android-cursorloader android-cursoradapter

13
推荐指数
1
解决办法
7357
查看次数

Loader将结果传递给错误的片段

基于android开发人员示例,我有一个使用ActionBar选项卡滑动选项卡的活动.

每个选项卡显示一个片段,每个片段(实际上,SherlockFragment)通过自定义AsyncTaskLoader加载不同类型的远程api请求.

问题是,如果您点击一个标签移动2个标签/页面,而您要离开的标签的片段(旧片段)正在加载结果,则该结果将传递到您移动到的标签的片段(新片段).在我的情况下,这会导致ClassCastException,因为预期的结果是不兼容的类型.

在代码中,情况的要点是:

装载机:

public class FooLoader extends AsyncTaskLoader<Foo>
public class BarLoader extends AsyncTaskLoader<Bar>
Run Code Online (Sandbox Code Playgroud)

片段:

public class FooFragment extends Fragment implements LoaderManager.LoaderCallbacks<Foo> {
...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(0, null, this);
    }
    public Loader<Foo> onCreateLoader(int id, Bundle args) { return new FooLoader(); }
...
}
public class BarFragment extends Fragment implements LoaderManager.LoaderCallbacks<Bar> {
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(0, null, this);
    }
    public Loader<Bar> onCreateLoader(int id, Bundle args) { return new …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager android-loadermanager android-loader

13
推荐指数
2
解决办法
2964
查看次数