Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在哪里调用和实现onStartLoading()和forceLoad()?_Java_Android_Loader - Fatal编程技术网

Java 在哪里调用和实现onStartLoading()和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

我正在MainActivity上实现LoaderManager.LoaderCallbacks,并重写onCreateLoader。在onCreateLoader中,我只返回一个AsyncTaskLoader对象,在这里我重写onStartLoading方法,在该方法中我检查查询是否为null。为了使这段代码有效,我需要调用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 */
        }

    };
}
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;
    }
}