Как я могу использовать библиотеку retrofit с progressbar?

Я использую модифицированную библиотеку. Как я могу использовать progressbar перед вызовом метода успеха обратного вызова ?

public void getMovies() {

    MovieClient.getWeather().movies(MovieClient.getRandomMovie(), new Callback<MovieRequest>() {
        @Override
        public void success(MovieRequest movieRequest, Response response) {

            Picasso.with(getApplicationContext()).load(movieRequest.getPoster()).into(image);

        }

        @Override
        public void failure(RetrofitError error) {
            Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();

        }
    });
}

2 ответов


вы можете использовать его таким образом:

public void getMovies() {

      ProgressDialog mProgressDialog = new ProgressDialog(this);
      mProgressDialog.setIndeterminate(true);
      mProgressDialog.setMessage("Loading...");
      mProgressDialog.show();
      MovieClient.getWeather().movies(MovieClient.getRandomMovie(), new Callback<MovieRequest>() {
      @Override
      public void success(MovieRequest movieRequest, Response response) {

         Picasso.with(getApplicationContext()).load(movieRequest.getPoster()).into(image);

         if (mProgressDialog.isShowing())
            mProgressDialog.dismiss();


    }

      @Override
      public void failure(RetrofitError error) {
          if (mProgressDialog.isShowing())
            mProgressDialog.dismiss();

          Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();

      }
   });
}

вы можете проверить этот метод util. Идея: создайте наблюдаемую оболочку, затем добавьте 2 действия "start" & "finish".

public static <T> Observable<T> bindLoadingAction(final Runnable start, final Runnable finish, final Observable<T> source) {
    final Observable<T> o = source.observeOn(AndroidSchedulers.mainThread());
    return o.lift(new Observable.Operator<T, T>() {
        @Override
        public Subscriber<? super T> call(final Subscriber<? super T> child) {
            return new Subscriber<T>() {
                @Override
                public void onStart() {
                    super.onStart();
                    if (start != null) {
                        new Handler(Looper.getMainLooper()).post(start::run);
                    }
                    child.onStart();
                }

                @Override
                public void onCompleted() {
                    if (finish != null) {
                        finish.run();
                    }
                    child.onCompleted();
                }

                @Override
                public void onError(Throwable e) {
                    if (finish != null) {
                        finish.run();
                    }
                    child.onError(e);
                }

                @Override
                public void onNext(T t) {
                    if (finish != null) {
                        finish.run();
                    }
                    child.onNext(t);
                }
            };
        }
    });
}

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

bindLoadingAction(this::showLoadingView, this::hideLoadingView, YourRetrofitObservable);

(я использовал синтаксис Java 8. this:: showLoadingView означает ссылку на метод showLoadingView в текущем классе.)