Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回对象时,onLoadFinished()如何从loadInBackground()接受数据?_Java_Android - Fatal编程技术网

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()