我有这段代码:
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;
}
}
}
主要活动:
@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();
}
AsyncTaskLoader
中的我没有指定泛型类型,而在LoaderManager.LoaderCallbacks<List<HourForecast>>
中我指定了泛型类型,
代码工作正常。
有人可以解释一下loadInBackground
的结果如何传递给onLoadFinished
?我问这个是loadInBackground
返回一个对象而onLoadFinished
接受List<HourForecast>
而不是Object
。
答案 0 :(得分:0)
在使用泛型的java中,删除了程序员和java中对象的转换需要,因为它的OOP默认情况下每个类都扩展了Object。
在你的情况下,AsyncTaskLoader有一个扩展Loader的泛型。如果未使用generic指定对象,则返回对象为Object。
这意味着方法
Loader<List<HourForecast>> onCreateLoader(int id, Bundle args) {
return new WeatherLoader(this,mUrl,HOURLY_FORECASTS);
你已经在创建WeatherLoader,你把它投射到Loader(它是AsyncTaskLoader的超类)然后你把它投到Loader<List<HourForecast>>
那里,你打电话给你的列表
@Override
public Object loadInBackground()
然而,这是你在那里的泛型的一个非常糟糕的例子。泛型用于消除运行时错误,您的示例只会使更多地方出现运行时错误。并且请不要使用AsyncTasks :)他们是邪恶的。阅读一些关于android编程的基础书籍,它教你使用处理程序。您的线程的最终解决方案是RxJava,但它更适合高级程序员。