2017-02-03 2 views
1

Ich wollte Code für die Einfachheit und Lesbarkeit umgestalten und deshalb möchte ich den Code außerhalb der Klasse verschieben und ein Ergebnis an die Klasse zurückgeben, wenn die Methode aufgerufen wird.Wie senden Sie Json-Daten, die von der Retrofit onResponse-Methode an andere Klassen zurückgegeben werden?

Versuch:

ArrayList<MovieReview> movieReview; 

    public ArrayList<MovieReview> getReviews(String id) { 
    if (NetworkUtil.isNetworkConnected(getActivity())) { 

     ApiInterface apiService = 
       ApiClient.getClient().create(ApiInterface.class); 

     Call<MovieReviewResponse> call = null; 

     call = apiService.getMovieReviews(id, BuildConfig.THE_MOVIE_DB_API_KEY); 

     call.enqueue(new Callback<MovieReviewResponse>() { 
      @Override 
      public void onResponse(Call<MovieReviewResponse> call, Response<MovieReviewResponse> response) { 
       movieReview= (ArrayList<MovieReview>) response.body().getMovieReviews(); 
      } 

      @Override 
      public void onFailure(Call<MovieReviewResponse> call, Throwable t) { 
       // Log error here since request failed 
       Log.e(TAG, t.toString()); 
      } 
     }); 

    } 
    return movieReview; 
} 

Ausgang: wenn ich Array-Liste auf Antwort außerhalb der verwendete gibt Nullwert.

aber wenn ich eine Methode aus einer Antwort aufgerufen und übergeben Sie das Ergebnis movieReview, als Parameter, es funktioniert gut.

Früher verwendete:

public void getReviews(String id) { 
    if (NetworkUtil.isNetworkConnected(getActivity())) { 

     ApiInterface apiService = 
       ApiClient.getClient().create(ApiInterface.class); 

     Call<MovieReviewResponse> call = null; 

     call = apiService.getMovieReviews(id, BuildConfig.THE_MOVIE_DB_API_KEY); 

     call.enqueue(new Callback<MovieReviewResponse>() { 
      @Override 
      public void onResponse(Call<MovieReviewResponse> call, Response<MovieReviewResponse> response) { 
       movieReview = (ArrayList<MovieReview>) response.body().getMovieReviews(); 
       setData(movieReview); 
      } 

      @Override 
      public void onFailure(Call<MovieReviewResponse> call, Throwable t) { 
       // Log error here since request failed 
       Log.e(TAG, t.toString()); 
      } 
     }); 

    } 

}` 
+0

Ich glaube, du bist ein Udacity Student und das ist Beliebte Filme-II-Projekt zu tun. Wenn Sie sagen könnten, warum Sie Daten zwischen Klassen weitergeben, oder können Sie genauer sein? –

+0

Ich wollte Code für Einfachheit und Lesbarkeit umgestalten und deshalb möchte ich den Code außerhalb der Klasse verschieben und ein Ergebnis in Klasse zurückgeben, wenn die Methode aufgerufen wird. – vicky

Antwort

0

Ausgang: wenn ich Array-Liste außerhalb der auf Antwort gibt

Nullwert

verwendet, weil das ist, wie asyncronus Methoden arbeiten. Ihr return passiert, bevor onResponse jemals passiert, so dass das Listenobjekt null ist.

Tipp: Im Idealfall möchten Sie immer eine leere Liste zurückgeben, nicht null sowieso.


Benennen Sie Ihre Methode um.

public ArrayList<MovieReview> getReviews(String id) 

Statt diesen Code

public ArrayList<MovieReview> getReviews(String id, Callback<MovieReviewResponse> callback) 

Um

call.enqueue(new Callback<MovieReviewResponse>() { 
    ... 
}); 

Mit diesem

call.enqueue(callback); 

01 ersetzen

Überall dort, wo Sie diese Methode

Jetzt tun

// In Activity 
String id = "X"; 
api.getReviews(id); 
nennen ....

// In Activity 
String id = "X"; 
api.getReviews(id, new Callback<MovieReviewResponse>() { 
    ... 
}); 

Und jetzt von innerhalbonResponse, können Sie ein Listview-Adapter aktualisieren, oder was auch immer Sie brauchen

0

Statt mit nur Retrofit nutzen RxAndroid. Wenn Sie dies verwenden, erhalten Sie eine Antwort von Observable<T>, die aus drei Override-Methoden besteht: onCompleted(), onError() und onNext(). In onNext() Methode rufen Sie Ihre spezifische Aktivität, übergeben Sie Ihre Daten durch putExtra und erhalten Sie getExtra.

+0

Sie erwähnen "Retrofit". Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und mögliche Links als Referenz bereitzustellen. –

Verwandte Themen