首页 文章

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

提问于
浏览
2

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

    };
}

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

public void forceLoad() {
    onForceLoad();
}

而onForceLoad()的实现是:

protected void onForceLoad() {
}

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

2 回答

  • 0

    Loader类具有onForceLoad()的空实现的原因是Loader是一个基类 . 他们的子类应该是在实现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;
    }
    
  • 1

    我们还可以覆盖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;
        }
    }
    

相关问题