2015-01-21 7 views
6

Utilizzo una libreria di aggiornamento. Come posso utilizzare la barra di avanzamento prima di chiamare il metodo di successo della richiamata?Come posso utilizzare la libreria di aggiornamento con barra di avanzamento?

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

     } 
    }); 
} 

risposta

20

Si può usare in questo modo:

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

     } 
    }); 
} 
+0

Sta funzionando? Ho la stessa identica struttura ma la mia app si arresta in modo anomalo quando si verifica l'evento – LKM

2

È forse controllare questo metodo util. Idea: creare wrapper osservabile quindi aggiungere 2 azioni "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); 
       } 
      }; 
     } 
    }); 
} 

Usa:

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

(ho usato Java 8 sintassi questo :: showLoadingView significa riferimento al metodo della showLoadingView in classe corrente..)

Problemi correlati