2017-02-18 3 views
0

ich habe diesen Code:Wie onLoadFinished() Daten von loadInBackground() akzeptieren, wenn return Object?

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

in der Haupttätigkeit:

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

    } 

im AsyncTaskLoader i nicht generischen Typen angeben, und in den LoaderManager.LoaderCallbacks<List<HourForecast>> i generischen Typen angeben, der Code richtig funktioniert .

Könnte mir jemand erklären, wie das Ergebnis von loadInBackground an onLoadFinished weitergegeben wird? Ich frage dies als loadInBackground gibt ein Objekt zurück und onLoadFinished akzeptiert eine List<HourForecast> und nicht eine Object.

Antwort

0

In Java mit generics entfernt die Notwendigkeit von Cast durch den Programmierer und Objekt in Java kann alles sein, da seine OOP jede Klasse Objekt standardmäßig erweitert.

In Ihrem Fall AsyncTaskLoader hat eine generische, die Loader erweitert. Wenn Sie das Objekt nicht mit generic angeben, ist das Rückgabeobjekt Object.

die in der Methode bedeutet

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

Sie bereits erstellen WeatherLoader Sie es Loader werfen (die übergeordnete Klasse von AsyncTaskLoader ist) Und Sie werfen es zu Loader<List<HourForecast>> für Sie da bekommen Sie Liste, wenn Sie

nennen
@Override 
public Object loadInBackground() 

Dies ist jedoch ein sehr schlechtes Beispiel für Generika, die Sie dort haben. Generics sind dafür gemacht, Laufzeitfehler zu vermeiden, und Ihr Beispiel macht nur mehr Orte, um einen Laufzeitfehler zu haben. Und bitte benutzt AsyncTasks nicht :) Sie sind das Böse. Lesen Sie einige grundlegende Bücher über Android-Programmierung, es lehrt Sie, Handler zu verwenden. Die ultimative Lösung für Ihr Threading wäre RxJava, aber eher für fortgeschrittene Programmierer.

+0

danke für die antwort mich und erklären einige code, jetzt das bild klar für mich (: –

Verwandte Themen