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;
}
}
我正在我的 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;
}
}