Java 什么调用loadInBackground方法,如何检索带有数据的列表

Java 什么调用loadInBackground方法,如何检索带有数据的列表,java,android,Java,Android,我已经从一个免费api获取了数据。数据正在arrayList中保存。我使用AsyncTaskLoader在另一个线程上获取数据。一切都很顺利,但我不知道如何使用MainActivity类上的数据检索arrayList MainActivity.java: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate: STA

我已经从一个免费api获取了数据。数据正在arrayList中保存。我使用AsyncTaskLoader在另一个线程上获取数据。一切都很顺利,但我不知道如何使用MainActivity类上的数据检索arrayList

MainActivity.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate: START");

    setContentView(R.layout.activity_main);


    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {
        LoaderManager loaderManager = getLoaderManager();
        loaderManager.initLoader(EARTHQUAKE_LOADER_ID, null, this);

    } else {

    }

    Log.i(TAG, "onCreate: END");

}


@Override
public Loader<List<News>> onCreateLoader(int id, Bundle args) {
    Log.i(TAG, "onCreateLoader: START");

    NewsLoader newsloader = new NewsLoader(this,URL);
    List<News> list = newsloader.getList();
    Log.i(TAG, "onCreateLoader: list: " + list);

    Log.i(TAG, "onCreateLoader: END");

    return newsloader;
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(标记“onCreate:START”);
setContentView(R.layout.activity_main);
ConnectivityManager connMgr=(ConnectivityManager)
getSystemService(Context.CONNECTIVITY\u服务);
NetworkInfo NetworkInfo=connMgr.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
LoaderManager LoaderManager=getLoaderManager();
initLoader(地震加载器ID,null,this);
}否则{
}
Log.i(标记“onCreate:END”);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
Log.i(标记“onCreateLoader:START”);
NewsLoader NewsLoader=newnewsloader(这个URL);
List List=newsloader.getList();
Log.i(标记“onCreateLoader:list:”+list);
Log.i(标记“onCreateLoader:END”);
返回新闻加载器;
}
NewsLoader.java:

public class NewsLoader extends AsyncTaskLoader<List<News>> {

private static final String TAG = "NewsLoader";
public List<News> listOfNews;
private String mUrl;

public NewsLoader(Context context, String url) {
    super(context);
    mUrl=url;
}

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

@Override
public List<News> loadInBackground() {
    Log.i(TAG, "loadInBackground: START");

    if(mUrl == null){
        return null;
    }

    listOfNews = QueryUtils.fetchDataFromPage(mUrl);

    Log.i(TAG, "loadInBackground: END");
    return listOfNews;
}
public List<News> getList(){
    return listOfNews;
}
公共类新闻加载器扩展了AsyncTaskLoader{
私有静态最终字符串TAG=“NewsLoader”;
新闻公开列表;
私人字符串mUrl;
公共新闻加载器(上下文、字符串url){
超级(上下文);
mUrl=url;
}
@凌驾
开始加载时受保护的void(){
力载荷();
}
@凌驾
公共列表加载背景(){
Log.i(标签“loadInBackground:START”);
if(mUrl==null){
返回null;
}
listOfNews=QueryUtils.fetchDataFromPage(mUrl);
日志i(标签“loadInBackground:END”);
返回新闻列表;
}
公共列表getList(){
返回新闻列表;
}
}

我也有News和QueryUtils类,但在这些类中一切都很顺利,问题是如何从MainActivity类访问列表

当我在方法外部声明List时,在类声明和创建List getter下,以及当我尝试从MainActivity获取List时:

    NewsLoader newsloader = new NewsLoader(this,URL);
    List<News> list = newsloader.getList();
    Log.i(TAG, "onCreateLoader: list: " + list);
NewsLoader NewsLoader=newnewsloader(这个URL);
List List=newsloader.getList();
Log.i(标记“onCreateLoader:list:”+list);
然后list为null,尽管在另一个类(NewsLoader)中,数据是在调用“getList”之前分配给list的

或者简单的问题就能解决问题:
NewsLoader.java中loadInBackground的列表返回到哪里

在做了一些测试之后,我得出了以下结论: 如果加载程序已经存在,则此行
loaderManager.initLoader(地震加载程序ID,null,this)
将跳转到以下方法
onLoadFinished(Loader,List data)
,您没有该方法。因此,在MainActivity中重写该方法。 大概是这样的:

//declare your arraylist here
protected void onCreate(Bundle savedInstanceState){...}

@Override
public Loader<List<News>> onCreateLoader(int id, Bundle args) {...}

@Override
onLoadFinished(Loader<List<News>> loader, List<News> data){
//assign data to your arraylist
}
//在此处声明您的arraylist
创建时受保护的void(Bundle savedInstanceState){…}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){…}
@凌驾
onLoadFinished(加载程序,列表数据){
//将数据分配给arraylist
}