如何在使用Retrofit库时添加进度条?

6

我正在使用Retrofit库。在调用回调成功方法之前,如何使用进度条?

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个回答

20
你可以这样使用它:
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();

      }
   });
}

它是否正常工作?我有完全相同的结构,但是当事件触发时我的应用程序会崩溃。 - LKM

3
你可以检查一下这个工具的使用方法。 思路:创建包装器 Observable,然后添加“开始”和“结束”两个动作。
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方法。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接