android如何 onLoadFinished() 接受来自 loadInBackground() 的数据时返回的对象?

标签: Java Android
发布时间: 2017/3/19 19:16:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有此代码︰

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;
        }
    }
}

在主要 activity :

  @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 我不指定泛型 type ,和在 LoaderManager.LoaderCallbacks<List<HourForecast>> 指定泛型 type ,代码正常工作。

能有人给我解释一下如何的结果 loadInBackground 获取传递到 onLoadFinished 吗?我问这作为 loadInBackground 返回的对象和 onLoadFinished 接受 List<HourForecast> 和不 Object

解决方法 1:

在 java 中使用泛型省去了对铸态由程序员和 java 中的对象可以是任何东西,自其 OOP 每类扩展对象默认情况下。

在你案例 AsyncTaskLoader 具有延伸的通用 Loader 。如果你不指定泛型对象,返回的对象是对象。

这意味着在方法中

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,但它更多的高级程序员。

赞助商