Android AsyncTaskLoader无法启动loadInBackground?

Bob*_*ke4 60 java android

我试图在Android上实现一个加载器示例,但无法让它启动加载器.我使用以下代码.它将点击"Create Loader",但它永远不会到达"正在加载"日志消息.我错过了我需要的电话吗?

活动:

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

装载机:

    public class ImageLoader extends AsyncTaskLoader<ArrayList<Content>> {

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

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

    }
Run Code Online (Sandbox Code Playgroud)

Ren*_*ard 128

我使用兼容性库时遇到了同样的问题.我通过电话解决了它forceLoad

getLoaderManager().initLoader(0, null, this).forceLoad();
Run Code Online (Sandbox Code Playgroud)

显然缺少AsyncLoader的文档,HoneyComb上也存在这个问题.更多信息可以在这里找到

AsyncTaskLoader 的官方示例也调用forceLoad(),因此它不是一个bug,但我仍然认为这种行为不是很直观.

  • 如你所知,如果请求的加载器已经存在并且已经生成了它的数据,则调用`LoaderManager.initLoader()`会触发触发`LoaderCallbacks <D> .onLoadFinished()`省略`AsyncTaskLoader <D> .onLoadInBackground()`回调.但同时'AsyncTaskLoader <D> .forceLoad()`强制加载程序重新开始时没有报告.这可能会导致意外行为.更好地查看方法`AsyncTaskLoader <D> .onStartLoading()`并在那里实现`AsyncTaskLoader <D> .forceLoad()`. (11认同)
  • 这会导致`loadInBackground()`被不必要地经常调用,即在方向改变时,这在正确覆盖`deliverResult()`和`onStartLoading()`时不会发生. (3认同)

小智 25

压倒loadInBackground()是不够的.

看一看在AppListLoaderhttp://developer.android.com/reference/android/content/AsyncTaskLoader.html.

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

        @Override
        protected void onStartLoading() {
            if (takeContentChanged())
                forceLoad();
        }

        @Override
        protected void onStopLoading() {
            cancelLoad();
        }
Run Code Online (Sandbox Code Playgroud)

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


Kit*_*Kat 13

rrayst的建议非常紧凑.如果你这样写你的方法:

protected void onStartLoading() {
    forceLoad();
}
Run Code Online (Sandbox Code Playgroud)

你会注意到当一个孩子的活动出现然后你回到父母的活动时,onStartLoading(等等loadInBackground)再次被召唤!

你能做什么?mContentChanged在构造函数中将内部变量()设置为true; 然后在里面检查这个变量onStartLoading.只有当它成立时才开始加载真实:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)