Java 在哪里调用和实现onStartLoading()和forceLoad()?
我正在MainActivity上实现LoaderManager.LoaderCallbacks,并重写onCreateLoader。在onCreateLoader中,我只返回一个AsyncTaskLoader对象,在这里我重写onStartLoading方法,在该方法中我检查查询是否为null。为了使这段代码有效,我需要调用forceLoad()。以下是代码片段:Java 在哪里调用和实现onStartLoading()和forceLoad()?,java,android,loader,Java,Android,Loader,我正在MainActivity上实现LoaderManager.LoaderCallbacks,并重写onCreateLoader。在onCreateLoader中,我只返回一个AsyncTaskLoader对象,在这里我重写onStartLoading方法,在该方法中我检查查询是否为null。为了使这段代码有效,我需要调用forceLoad()。以下是代码片段: @Override public Loader<String> onCreateLoader(int id, final
@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 */
}
};
}
onForceLoad()的实现是:
我试图在代码的其他部分(我使用(getSupportLoaderManager().initLoader(arg1,arg2,arg3))中找到一些重写forceLoad()或onForceLoad的方法,但直到现在都没有成功。为什么我必须调用forceLoad(),为什么它可以工作?原因是Loader类有空的onForceLoad()实现加载程序是一个基类。它们的子类应该实现onForceLoad() 如果我们看到您的代码,您使用的是AsyncTaskLoader,它基本上是Loader的子类,因此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;
}
public-Loader-onCreateLoader(int-id,final-Bundle-args){
AsyncTaskLoader=新的AsyncTaskLoader(此){
@凌驾
开始加载时受保护的void(){
//如果未传递任何参数,则无需形成查询
如果(args==null){
返回;
}
}
@凌驾
公共字符串loadInBackground(){
/*一些代码*/
}
};
loader.forceLoad();//这基本上可以运行加载程序。
返回装载机;
}
我们还可以重写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;
}
}
公共类加载器扩展了AsyncTaskLoader{
//日志消息的标记
私有静态最终字符串LOG_TAG=Loader.class.getName();
//查询URL
私人字符串mUrl;
/**
*构造一个新的{@link data}
*
*@param活动的上下文
*@param url以从中加载数据
*/
公共加载程序(上下文、字符串url){
超级(上下文);
mUrl=url;
}
@凌驾
开始加载时受保护的void(){
力载荷();
}
/**
*这是在后台线程上
*/
@凌驾
公共列表加载背景(){
if(mUrl==null){
返回null;
}
//执行网络请求,解析响应并提取数据列表。
列表数据=QueryUtils.fetchData(mUrl);
返回数据;
}
}
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;
}
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;
}
}