2017-02-18 27 views
0

我有这样的代码:onLoadFinished()在返回Object时如何接受来自loadInBackground()的数据?

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

在使用泛型的java中不需要由程序员和对象在java中进行强制类型转换,因为它的OOP每个类都在默认情况下扩展了Object。

在你的情况下,AsyncTaskLoader有一个扩展Loader的泛型。如果您不指定具有泛型的对象,则返回对象为Object。

的方法,这意味着

Loader<List<HourForecast>> onCreateLoader(int id, Bundle args) { 
    return new WeatherLoader(this,mUrl,HOURLY_FORECASTS); 

您已经创建WeatherLoader你将它转换为装载机(这是AsyncTaskLoader的超)而你将它转换为Loader<List<HourForecast>>那里你当你调用

你列出
@Override 
public Object loadInBackground() 

但是,这是一个非常不好的例子,你在那里的泛型。泛型被用来消除运行时错误,你的例子只是让更多的地方产生运行时错误。请不要使用AsyncTasks :)他们是邪恶的。阅读一些关于android编程的基本书籍,它会教你使用处理程序。线程的最终解决方案是RxJava,但对于高级程序员来说更是如此。

+0

谢谢你回答我并解释一些代码,现在图片清晰了我(: –

相关问题