2017-02-03 16 views
1

Мне нужен код рефакторинга для простоты и удобочитаемости, поэтому я хочу переместить код вне класса и вернуть результат в класс всякий раз, когда вызывается метод.Как отправить данные Json, возвращаемые методом Retrofit onResponse другому классу?

Попытка:

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

Выход:, если я использовал список массива вне на ответ дает нулевое значение.

но если я вызвал метод из ответа и передал результат movieReview, в качестве параметра он отлично работает.

Ранее использовали:

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

Я предполагаю, что вы студент Udacity и это популярные фильмы проекта II. Если бы вы могли понять, почему вы передаете данные между классами или просто можете быть более конкретными? –

+0

Я хотел реорганизовать код для простоты и удобочитаемости, поэтому я хочу переместить код вне класса и возвращать результат в класс всякий раз, когда вызывается метод. – vicky

ответ

0

Вывод: если я использовал список массива вне на ответ дает нулевое значение

Потому что, как работают asyncronus методы. Ваш return происходит до onResponse, так что объект списка имеет значение null.

Совет. В идеальных ситуациях вы всегда должны возвращать пустой список, а не null в любом случае.


Переименуйте свой метод.

public ArrayList<MovieReview> getReviews(String id) 

Для Вместо

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

Заменить этот код

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

С этим

call.enqueue(callback); 

Где бы вы вызываете этот метод

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

теперь делать ....

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

И теперь от вonResponse, вы можете обновить адаптер ListView, или все, что вам нужно сделать

0

Вместо того, чтобы использовать только Дооснащаемый использовать грим из RxAndroid. Используя это, вы получите ответ Observable<T>, который состоит из трех методов переопределения onCompleted(), onError() и onNext(). В методе onNext() вызовите свою конкретную деятельность, передайте свои данные через putExtra и пройдите через getExtra.

+0

Вы упоминаете «Дооснащение». Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить основные части ответа здесь и предоставить возможные ссылки для справки. –

 Смежные вопросы

  • Нет связанных вопросов^_^