当返回Object时onLoadFinished()如何接受来自loadInBackground()的数据?

时间:2017-02-18 12:53:58

标签: 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 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

1 个答案:

答案 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,但它更适合高级程序员。