2016-04-03 2 views
1

Ich habe Facebook-Login mit Retrofit in meiner neuesten Android-Anwendung implementiert. In SplashActivity und LoginActivity möchte ich meine POST-Anfrage machen:Doppelte Nachrüstung vermeiden Callback

FacebookLoginInfo facebookLoginInfo = new FacebookLoginInfo(token); 
Call<User> call = ApiManager.getService().authenticateFacebookUser(facebookLoginInfo); 
call.enqueue(userCallback); 

FacebookLoginInfo ist eine einfache POJO mit dem Zugriffstoken Facebook. ApiManager ist eine Singleton-Klasse für meinen Dienst.

Mein Problem ist, dass userCallback in SplashActivity und LoginActivity dupliziert ist. Gibt es eine bewährte Vorgehensweise, um diesen Rückruf nur einmal zu definieren?


Definition des Benutzers Rückruf:

private Callback<User> mUserCallback = new Callback<User>() { 
    @Override 
    public void onResponse(Call<User> call, Response<User> response) { 
     dismissProgressDialog(); 

     int statusCode = response.code(); 
     if (statusCode == 200) { 
      User user = response.body(); 
      Log.e(LOG_TAG, "user: " + user.toString()); 

      Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
      intent.putExtra(Global.EXTRA_USER, user); 
      startActivity(intent); 
     } else if (statusCode == 400) { 
      Toast.makeText(LoginActivity.this, getString(R.string.error_token_required), Toast.LENGTH_SHORT).show(); 
     } else if (statusCode == 403) { 
      Toast.makeText(LoginActivity.this, getString(R.string.error_invalid_token), Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onFailure(Call<User> call, Throwable t) { 
     dismissProgressDialog(); 
     t.printStackTrace(); 
     Toast.makeText(LoginActivity.this, getString(R.string.error_call_failed), Toast.LENGTH_SHORT).show(); 
    } 
}; 

Antwort

1

können Sie eine Klasse erstellen UserCallback aufgerufen, die Callback implementiert und es verwenden, wo Sie wollen.

in Ihrem Fall:

public class UserCallback implements Callback<EventResponseList> { 
@Override 
    public void onResponse(Call<User> call, Response<User> response) { 
     dismissProgressDialog(); 

     int statusCode = response.code(); 
     if (statusCode == 200) { 
      User user = response.body(); 
      Log.e(LOG_TAG, "user: " + user.toString()); 

      Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
      intent.putExtra(Global.EXTRA_USER, user); 
      startActivity(intent); 
     } else if (statusCode == 400) { 
      Toast.makeText(LoginActivity.this, getString(R.string.error_token_required), Toast.LENGTH_SHORT).show(); 
     } else if (statusCode == 403) { 
      Toast.makeText(LoginActivity.this, getString(R.string.error_invalid_token), Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onFailure(Call<User> call, Throwable t) { 
     dismissProgressDialog(); 
     t.printStackTrace(); 
     Toast.makeText(LoginActivity.this, getString(R.string.error_call_failed), Toast.LENGTH_SHORT).show(); 
    } 
} 

und wann Sie wollen, es zu benutzen:

FacebookLoginInfo facebookLoginInfo = new FacebookLoginInfo(token); 
Call<User> call = ApiManager.getService().authenticateFacebookUser(facebookLoginInfo); 
call.enqueue(new UserCallback()); 
+0

Vielen Dank für Ihre Antwort. Ich schaffte es, meinen asynchronen Anruf mit call.enqueue (neuer Rückruf <>() {}) zu machen. Meine Frage ist mehr, was ist die beste Vorgehensweise, wenn ich den gleichen Rückruf in zwei verschiedenen Aktivitäten verwenden möchte? – baptisterobert

+0

Ich denke, Sie sollten eine Klasse namens UserCallback erstellen, die Callback implementiert und verwenden, wo Sie möchten. – humazed

+0

Ich arbeitete an einer Open-Source-App und wie wir dieses Problem lösen Bitte werfen Sie einen Blick https://github.com/fossasia/open-event-android/blob/master/app%2Fsrc%2Fmain%2Fjava%2Forg % 2Ffossasia% 2Fopenevent% 2Fapi% 2Fprocessor% 2FEventListResponseProcessor.java – humazed