2017-06-27 3 views
0

Ich lerne über die Loader und ihre Implementierung mit AsynkTaskLoader.In diesem Fall verwendet AsynkTaskLoader Cache-Daten?

In vielen Beispielen habe ich gesehen, dass in der AsynkTaskLoader onStartLoading Methode ist, wo die cache überprüft wird, und wenn es nicht null ist, wird das Ergebnis direkt geliefert. Diese Methode wird jedoch nur das erste Mal aufgerufen, wenn die Loader initiiert wird, da zum Beispiel, wenn sich die Gerätekonfiguration ändert und die Loader erneut von Activity OnCreate Methode Loader Anruf direkt onLoadFinished Methode aufgerufen wird.

Um die Funktion der Loader besser zu verstehen, würde ich gerne wissen, wie ich einen Fall neu erstellen kann, wo der Cache verwendet wird.

Hier einige Beispiel-Code:

static class ExampleAsyncTaskLoader extends AsyncTaskLoader<String>{ 
    String mCacheData; 
    Bundle mArgs; 

    ExampleAsyncTaskLoader(Context context, Bundle args) { 
     super(context); 
     mArgs = args; 
    } 

    @Override 
    protected void onStartLoading() { 
      /* If no arguments were passed, we don't have a query to perform. Simply return. */ 
     if (mArgs == null) { 
      return; 
     } 

     if (mCacheData != null){ 
      deliverResult(mCacheData); 
     }else { 
      forceLoad(); 
     } 
    } 

    @Override 
    public String loadInBackground() { 

      /* Extract the search query from the args using our constant */ 
     String searchQueryUrlString = mArgs.getString(SEARCH_QUERY_URL_EXTRA); 

      /* If the user didn't enter anything, there's nothing to search for */ 
     if (searchQueryUrlString == null || TextUtils.isEmpty(searchQueryUrlString)) { 
      return null; 
     } 

      /* Parse the URL from the passed in String and perform the search */ 
     try { 
      URL githubUrl = new URL(searchQueryUrlString); 
      return NetworkUtils.getResponseFromHttpUrl(githubUrl); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    public void deliverResult(String data) { 
     mCacheData = data; 
     super.deliverResult(data); 
    } 
} 

Antwort

1

Falls die Aktivität zerstört und neu erstellt (wie in Konfigurationsänderung), wenn der Loader Daten bereit ist - Sie werden es über die deliverResult erhalten. Allerdings im Falle der Aktivität Pause und dann wieder - das Standardverhalten ist, die Daten erneut abzurufen, Dies ist, wenn der "lokale Cache" sinnvoll ist.