You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从onNewsReceived方法中取出ArrayList并通过getNews方法返回?

解决异步回调中返回数据的问题

哎,这个问题我太熟了——你现在的写法根本拿不到正确的newsList,因为getNewsDataSource是异步操作,当你执行到return newsList的时候,onNewsReceived回调还没被触发呢!同步返回的方式在这里行不通,得换异步的思路来传递结果,下面给你几种常见的解决方案:

方案1:复用现有NewsListener回调

直接修改getNews的方法签名,让它接受一个回调参数,把结果通过回调传递给调用者,而不是试图同步返回:

// 修改后的getNews方法
public void getNews(NewsListener listener) {
    getNewsDataSource(new NewsListener() {
        @Override
        public void onNewsReceived(ArrayList<News> newsList) {
            Log.i("news:", newsList.toString());
            // 将拿到的列表通过传入的回调返回
            listener.onNewsReceived(newsList);
        }
    });
}

调用方式:

// 调用getNews时,传入自己的回调处理结果
getNews(new NewsListener() {
    @Override
    public void onNewsReceived(ArrayList<News> newsList) {
        // 在这里处理拿到的newsList,比如更新UI、存储数据
    }
});

方案2:使用Android Jetpack LiveData(适合Android开发)

如果是Android项目,用LiveData是更优雅的方式,它自带生命周期感知,能避免内存泄漏:

// 定义一个MutableLiveData来持有新闻列表
private MutableLiveData<ArrayList<News>> newsLiveData = new MutableLiveData<>();

public LiveData<ArrayList<News>> getNews() {
    getNewsDataSource(new NewsListener() {
        @Override
        public void onNewsReceived(ArrayList<News> newsList) {
            Log.i("news:", newsList.toString());
            // 将结果post到LiveData,自动通知观察者
            newsLiveData.postValue(newsList);
        }
    });
    return newsLiveData;
}

调用方式:

// 在Activity/Fragment中观察LiveData的变化
getNews().observe(this, newsList -> {
    // 这里拿到最新的newsList,做后续处理
});

方案3:使用RxJava(如果项目已引入RxJava)

如果你的项目已经在用RxJava,用Observable来包装异步结果也很方便:

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;

public Observable<ArrayList<News>> getNews() {
    return Observable.create(emitter -> {
        getNewsDataSource(new NewsListener() {
            @Override
            public void onNewsReceived(ArrayList<News> newsList) {
                Log.i("news:", newsList.toString());
                emitter.onNext(newsList);
                emitter.onComplete();
            }
        });
    });
}

调用方式:

getNews()
    .subscribeOn(Schedulers.io()) // 在IO线程执行异步请求
    .observeOn(AndroidSchedulers.mainThread()) // 切换到主线程处理结果
    .subscribe(
        newsList -> { /* 处理拿到的新闻列表 */ },
        throwable -> { /* 处理请求失败的情况 */ }
    );

为什么原来的写法不行?

简单说:getNewsDataSource是异步执行的,它的回调onNewsReceived会在未来某个时间点(比如网络请求完成后)才会被调用,而你的getNews方法是同步执行的,执行到return newsList时,回调还没触发,所以返回的要么是null,要么是未初始化的空列表,根本拿不到正确的数据。

内容的提问来源于stack exchange,提问作者Arjun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:39