Java 返回对象时,onLoadFinished()如何从loadInBackground()接受数据?
我有以下代码:Java 返回对象时,onLoadFinished()如何从loadInBackground()接受数据?,java,android,Java,Android,我有以下代码: public class WeatherLoader extends AsyncTaskLoader { /** Tag for log messages */ private static final String LOG_TAG = WeatherLoader.class.getName(); private String mUrl; private int mDataWeatherType; public WeatherLoad
public class WeatherLoader extends AsyncTaskLoader {
/** Tag for log messages */
private static final String LOG_TAG = WeatherLoader.class.getName();
private String mUrl;
private int mDataWeatherType;
public WeatherLoader(Context context, String url , int dataWeatherType) {
super(context);
mUrl = url;
mDataWeatherType = dataWeatherType;
}
@Override
public Object loadInBackground() {
Log.i(LOG_TAG , "TEST : loadInBackground() called ...");
if(mUrl == null){
return null;
}
if( mDataWeatherType == 1) {
CurrentWeather currentWeather = QueryUtils.fetchCurrentWeatherData(mUrl);
return currentWeather;
}else if(mDataWeatherType == 2) {
List<HourForecast> hourlyForecastsList = QueryUtils.fetchHourlyForecastsData(mUrl);
return hourlyForecastsList;
}else {
List<DayForecast> dailyForecastsList= QueryUtils.fetchDailyForecastsData(mUrl);
return dailyForecastsList;
}
}
}
公共类WeatherLoader扩展了AsyncTaskLoader{
/**日志消息的标记*/
私有静态最终字符串LOG_TAG=WeatherLoader.class.getName();
私人字符串mUrl;
私有int-mDataWeatherType;
公共WeatherLoader(上下文上下文、字符串url、int-dataWeatherType){
超级(上下文);
mUrl=url;
mDataWeatherType=数据WeatherType;
}
@凌驾
公共对象loadInBackground(){
i(Log_标记,“TEST:loadInBackground()调用…”);
if(mUrl==null){
返回null;
}
如果(mDataWeatherType==1){
CurrentWeather CurrentWeather=QueryUtils.fetchCurrentWeatherData(mUrl);
回归天气;
}else if(mDataWeatherType==2){
List hourlyForecastsList=QueryUtils.fetchHourlyForecastsData(mUrl);
返回CastsList的小时数;
}否则{
List DailyForecastList=QueryUtils.FetchDailyForecastData(mUrl);
返回每日预报员名单;
}
}
}
在主要活动中:
@Override
public Loader<List<HourForecast>> onCreateLoader(int id, Bundle args) {
return new WeatherLoader(this,mUrl,HOURLY_FORECASTS);
}
@Override
public void onLoadFinished(Loader<List<HourForecast>> loader, List<HourForecast> data) {
mHourForecastAdapter.clear();
mHourForecastAdapter.addAll(data);
}
@Override
public void onLoaderReset(Loader<List<HourForecast>> loader) {
mHourForecastAdapter.clear();
}
@覆盖
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的WeatherLoader(此、mUrl、每小时天气预报);
}
@凌驾
public void onLoadFinished(加载程序,列表数据){
mHourForecastAdapter.clear();
mHourForecastAdapter.addAll(数据);
}
@凌驾
公共void onLoaderReset(加载器){
mHourForecastAdapter.clear();
}
在AsyncTaskLoader
中,我没有指定泛型类型,而在LoaderManager.LoaderCallbacks中,我指定泛型类型,
代码工作正常
有人能给我解释一下loadInBackground
的结果是如何传递给onLoadFinished
的吗?我这样问是因为loadInBackground
返回一个对象,而onLoadFinished
接受一个列表
,而不是对象,在java中使用泛型消除了程序员对强制转换的需要,java中的对象可以是任何东西,因为它的OOP每个类默认扩展对象
在您的情况下,AsyncTaskLoader有一个扩展加载程序的泛型。如果未使用泛型指定对象,则返回对象为对象
这意味着在方法中
Loader<List<HourForecast>> onCreateLoader(int id, Bundle args) {
return new WeatherLoader(this,mUrl,HOURLY_FORECASTS);
然而,这是一个非常糟糕的泛型示例。泛型是用来消除运行时错误的,而您的示例只是让更多的地方出现运行时错误。请不要使用AsyncTasks:)它们是邪恶的。阅读一些关于android编程的基本书籍,它教你如何使用处理器。线程的最终解决方案是RxJava,但更多的是面向高级程序员。感谢您回答我的问题并解释一些代码,现在我清楚了(:
@Override
public Object loadInBackground()