2016-06-03 12 views
5

Wie erreicht man das Anzeigen eines Fortschrittsbalkens bei jedem API-Aufruf Retrofit 2.0, ohne dass in jeder Aktivität ein Fortschrittsbalken angezeigt werden muss, der angezeigt und abgelehnt wird. Fortschrittsbalken sollte zeigen, wann immer eine API getroffen wird, und es sollte entlassen werden, wenn wir eine Antwort auf onResponse oder onFailure erhalten.Wie wird die Progress Bar bei jedem Retrofit-API-Aufruf automatisch angezeigt?

Ich versuchte dies:

ProgressDialog mProgressDialog = new ProgressDialog(this); 
mProgressDialog.setIndeterminate(true); 
mProgressDialog.setMessage("Loading..."); 
mProgressDialog.show(); 
retrofitService.login(new SignInRequest(email, password), 
       new Callback<SignInResponse>() { 
     @Override 
     public void onResponse(Call<SignInResponse> call, Response<SignInResponse> response) { 

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

     @Override 
     public void onFailure(Call<SignInResponse> call, Throwable t) { 
       if (mProgressDialog.isShowing()) 
        mProgressDialog.dismiss(); 
      } 
}); 

Aber dieser Code wird überall geklebt kopieren, wann immer ich einen API-Aufruf zu machen. Ich möchte keinen doppelten Code.

+1

eine Basisaktivität machen, um all diese Arbeit zu erledigen? – Sourabh

+0

Geben Sie ein Beispiel an .. –

Antwort

2

Wie @Sourabh vorgeschlagen, landete ich eine Basisaktivität mit und einfache Methode bei jedem API-Aufruf aufrufen. In BaseActivity,

public void showDialog() { 

    if(mProgressDialog != null && !mProgressDialog.isShowing()) 
     mProgressDialog.show(); 
} 

public void hideDialog() { 

    if(mProgressDialog != null && mProgressDialog.isShowing()) 
     mProgressDialog.dismiss(); 
} 

In Ihrem Kind-Aktivität können Sie direkt showDialog() und hideDialog() rufen Dialog zu zeigen und entlassen.

6

Eine weitere innere Klasse in Ihrer Aktivität könnte Sie hier speichern.

class MyCallBack implements CallBacks<T>{ 
    @Override 
    public void onResponse(Call<T> call, Response<T> response) { 

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

    @Override 
    public void onFailure(Call<SignInResponse> call, Throwable t) { 
      if (mProgressDialog.isShowing()) 
       mProgressDialog.dismiss(); 
     } 
} 

Wenn Sie eine Anfrage senden:

retrofitService.login(new SignInRequest(email, password), 
      new MyCallback<SignInResponse>() { 
    @Override 
    public void onResponse(Call<SignInResponse> call, Response<SignInResponse> response) { 
      super(call, response); 
      //do more on response 
     } 

    @Override 
    public void onFailure(Call<SignInResponse> call, Throwable t) { 
      super(call, error); 
      /* Do more on failure. For example, give a reason why the 
      request failed*/ 
     } 
}); 
0

Beispiel aus Tutorial:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    requestWindowFeature(Window.FEATURE_PROGRESS); 
    ArrayAdapter<Question> arrayAdapter = 
      new ArrayAdapter<Question>(this, 
        android.R.layout.simple_list_item_1, 
        android.R.id.text1, 
        new ArrayList<Question>()); 
    setListAdapter(arrayAdapter); 
    setProgressBarIndeterminateVisibility(true); 
    setProgressBarVisibility(true); 
} 

Tutorial Link: http://www.vogella.com/tutorials/Retrofit/article.html

+0

Dieser Ansatz ist seit API 21 veraltet. Gibt es eine Alternative für Rx? – fobo66

2

Basierend auf den Antworten von Shubham und Peter, ich habe eine Klasse wie folgt geschrieben:

class CustomCallBack<T> implements Callback<T> { 

private ProgressDialog mProgressDialog; 
Context context; 

CustomCallBack(Context context) { 
    this.context = context; 
    mProgressDialog = new ProgressDialog(context); 
    ((Activity) context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
      WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
    mProgressDialog.setIndeterminate(true); 
    mProgressDialog.setMessage("Loading..."); 
    mProgressDialog.setCanceledOnTouchOutside(false); 
    mProgressDialog.show(); 

} 

@Override 
public void onResponse(Call<T> call, Response<T> response) { 
    if (mProgressDialog.isShowing()) { 
     mProgressDialog.dismiss(); 
     ((Activity) context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
    } 

} 

@Override 
public void onFailure(Call<T> call, Throwable t) { 
    if (mProgressDialog.isShowing()) { 
     mProgressDialog.dismiss(); 
     ((Activity) context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
    } 

} 
} 

Ich hoffe, es wird dir helfen.

0

Shameless Promotion

ich RxLoading library dafür erstellt haben, können sie dies tun, und vieles mehr,

können Sie nur so etwas tun:

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...); 

es besteht Von 2 Klassen, eine benutzerdefinierte Ansicht (loadingLayout) und RxLoading, die eine transformer ist, die alles zusammenkleben, können Sie wählen, mit beiden oder einer von beiden zu arbeiten.

Wenn Sie einen Fortschrittsbalken wollen, dass sie alle beherrschen, haben Sie mehrere Möglichkeiten es auf die Struktur Ihrer Anwendung abhängig zu erreichen:

  • eine Aktivität mehrere Fragmente -> legen sich lediglich ein loadingLayout im Haupt Bildschirm und sagen Sie ihm, um das Fragment Layout beim Laden zu verstecken
  • mehrere Aktivitäten: Erstellen Sie eine Basis-Aktivität, die alle verwendet und ein loadingLayout zu allen Ansichten
  • injizieren Sie können auch einen speziellen Dialog oder eine Aktivität für den Fortschrittsbalken und Verwenden Sie eine Schnittstelle für RxLoading, um es ein- und auszublenden.

RxLoading unterstützt auch leer und Fehlerzustände (mit eingebautem in Wiederholungsmechanismus, so stellen Sie sicher, dass auch diese Optionen überprüfen)

Sie können mehr über die GitHub page erfahren.