Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i use retrofit library with progressbar?

I am using retrofit library. How can i use progressbar before calling callback success method ?

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();

        }
    });
}
like image 549
previousdeveloper Avatar asked Jan 21 '15 19:01

previousdeveloper


2 Answers

You can use it this way:

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();

      }
   });
}
like image 152
kelvincer Avatar answered Oct 20 '22 23:10

kelvincer


You maybe check this method util. Idea: create wrapper observable then add 2 action "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);
                }
            };
        }
    });
}

Use:

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

(I used Java 8 syntax. this::showLoadingView meaning reference to showLoadingView method in current class.)

like image 37
quangson91 Avatar answered Oct 20 '22 21:10

quangson91