如何将Retrofit onResponse方法返回的Json数据发送到其他类?

时间:2017-02-03 15:42:05

标签: java android json retrofit retrofit2

我想重构代码以简化和可读性,这就是为什么我想在代码外部移动代码并在调用方法时将结果返回给类。

尝试:

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

输出:如果我在on响应之外使用数组列表给出null值。

但是如果我从响应中调用一个方法并将结果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());
            }
        });

    }

}`

2 个答案:

答案 0 :(得分:0)

不使用 Retrofit ,而是使用 RxAndroid 。通过使用此功能,您将获得Observable<T>的响应,其中包含三种覆盖方法onCompleted()onError()onNext()。 在onNext()方法中调用您的特定活动,将您的数据传递到putExtra并通过getExtra

答案 1 :(得分:0)

  

输出:如果我在on响应之外使用数组列表给出空值

因为这是asyncronus方法的工作原理。您的return发生在onResponse之前,因此列表对象为空。

提示:在理想情况下,您希望始终返回空列表,而不是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适配器,或者您需要做的任何事情