首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓AsyncTaskLoader启动不了loadInBackground?

安卓AsyncTaskLoader启动不了loadInBackground?
EN

Stack Overflow用户
提问于 2012-05-10 05:57:23
回答 5查看 22.6K关注 0票数 63

我正在尝试在Android上实现一个加载器示例,但无法让它启动加载器。我正在使用下面的代码。它将命中"Create Loader“,但永远不会到达"Loading started”日志消息。我是不是错过了我需要的电话?

活动:

代码语言:javascript
复制
    public class TestingZoneActivity extends ListActivity implements LoaderCallbacks<ArrayList<Content>>{

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            getLoaderManager().initLoader(0, null, this);
        }

        @Override
        public Loader<ArrayList<Content>> onCreateLoader(int id, Bundle args) {
            Log.e("TEST", "Create Loader");
            return new ImageLoader(this);
        }

        @Override
        public void onLoadFinished(Loader<ArrayList<Content>> loader, ArrayList<Content> data) {
            setListAdapter(new ImageAdapter(this, data));
        }

        @Override
        public void onLoaderReset(Loader<ArrayList<Content>> loader) {
            setListAdapter(null);
        }
    }

加载器:

代码语言:javascript
复制
    public class ImageLoader extends AsyncTaskLoader<ArrayList<Content>> {

        public ImageLoader(Context context) {
            super(context);
        }

        @Override
        public ArrayList<Content> loadInBackground() {
            Log.e("TEST", "Loading started");
        }

    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-10 23:30:52

我在使用兼容性库时也遇到了同样的问题。我通过调用forceLoad解决了这个问题

代码语言:javascript
复制
getLoaderManager().initLoader(0, null, this).forceLoad();

显然,缺乏关于AsyncLoader的文档,并且在HoneyComb上也存在这个问题。欲获知更多信息,请访问here

AsyncTaskLoader的官方example也调用了forceLoad(),所以这不是一个bug,但我仍然认为这种行为不是很直观。

票数 131
EN

Stack Overflow用户

发布于 2013-05-18 01:41:10

仅覆盖loadInBackground()是不够的。

看看http://developer.android.com/reference/android/content/AsyncTaskLoader.html上的AppListLoader吧。

至少将这两个方法添加到您的加载器中:

代码语言:javascript
复制
        @Override
        protected void onStartLoading() {
            if (takeContentChanged())
                forceLoad();
        }

        @Override
        protected void onStopLoading() {
            cancelLoad();
        }

并从其构造函数调用onContentChanged()

票数 26
EN

Stack Overflow用户

发布于 2013-10-21 02:36:27

rrayst的建议非常简洁。如果你这样写你的方法:

代码语言:javascript
复制
protected void onStartLoading() {
    forceLoad();
}

你会注意到,当子活动出现,然后你返回父活动时,onStartLoading (以及loadInBackground)会再次被调用!

你能做什么?在构造函数中将内部变量(mContentChanged)设置为true;然后在onStartLoading中检查此变量。只有当它是真的时,才开始真正的加载:

代码语言:javascript
复制
package example.util;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public abstract class ATLoader<D> extends AsyncTaskLoader<D> {

    public ATLoader(Context context) {
        super(context);
        // run only once
        onContentChanged();
    }

    @Override
    protected void onStartLoading() {
        // That's how we start every AsyncTaskLoader...
        // -  code snippet from  android.content.CursorLoader  (method  onStartLoading)
        if (takeContentChanged()) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10524667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档