onStartLoading() 和forceLoad() 是在哪里调用和实现的?

Where is onStartLoading() and forceLoad() called and implemented?

我正在我的 MainActivity 上实现 LoaderManager.LoaderCallbacks 并且我正在覆盖 onCreateLoader。在 onCreateLoader 中,我只是 return 一个 AsyncTaskLoader 对象,我在其中覆盖了 onStartLoading 方法,在该方法中我检查查询是否为空。为了使这段代码有效,我需要调用 forceLoad()。这是代码片段:

@Override
public Loader<String> onCreateLoader(int id, final Bundle args) {

    return new AsyncTaskLoader<String>(this) {

        @Override
        protected void onStartLoading() {
            // No need to peform a query if no arguments were passed
            if (args == null) {
                return;
            }

            // This needs to be called!!
            forceLoad();
        }

        @Override
        public String loadInBackground() {
            /* some code */
        }

    };
}

问题是我不知道为什么要调用forceLoad(),因为它的实现是一个"empty"方法。在Loader Class的源码中,forceLoad的实现是:

public void forceLoad() {
    onForceLoad();
}

onForceLoad() 的实现是:

protected void onForceLoad() {
}

我试图在代码的其他部分找到一些覆盖 forceLoad() 或 onForceLoad 的方法(我使用 (getSupportLoaderManager().initLoader(arg1, arg2, arg3)),但直到现在都没有成功. 为什么我必须调用 forceLoad() 以及它为什么起作用?

Loader class 空执行 onForceLoad() 的原因是 Loader 是一个基础 class。他们的 child classes 应该实现 onForceLoad()。

如果我们将看到您的代码,您正在使用 AsyncTaskLoader,它基本上是一个 child 加载程序,因此 AsyncTaskLoader 将具有 onForceLoad() 实现,实际上是这样的:

 @Override
    protected void onForceLoad() {
        super.onForceLoad();
        cancelLoad();
        mTask = new LoadTask();
        if (DEBUG) Slog.v(TAG, "Preparing load: mTask=" + mTask);
        executePendingTask();
    }

你的onCreateLoader()基本上应该是这样的:

public Loader<String> onCreateLoader(int id, final Bundle args) {
      AsyncTaskLoader<String> loader = new AsyncTaskLoader<String>(this) {
            @Override
            protected void onStartLoading() {
                // No need to peform a query if no arguments were passed
                if (args == null) {
                    return;
                }
            }

            @Override
            public String loadInBackground() {
                /* some code */
            }

      };

      loader.forceLoad(); // This basically gonna run the loader.
      return loader;
}

我们也可以覆盖 onStartLoading() 方法来调用 forceLoad() ,这是实际触发 loadInBackground() 方法执行的必要步骤。

public class Loader extends AsyncTaskLoader<List<data>> {

    // Tag for Log messages
    private static final String LOG_TAG = Loader.class.getName();

    // Query URL
    private String mUrl;

    /**
     * Constructs a new {@link data}
     *
     * @param context of the activity
     * @param url to load the data from
     */
    public Loader (Context context, String url)   {
        super(context);
        mUrl = url;
    }

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

    /**
     * This is on the background thread
     */
    @Override
    public List<data> loadInBackground() {
        if(mUrl == null)    {
            return null;
        }

        // Perform the network request, parse the response and extract a list of data.
        List<data> data= QueryUtils.fetchData(mUrl);
        return data;
    }
}