2016-04-03 96 views
1

我在我最新的Android應用程序中使用Retrofit實施了Facebook登錄。在SplashActivity和LoginActivity,我想讓我的POST請求:避免重複的翻新回調

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

FacebookLoginInfo是一個簡單的POJO與Facebook的訪問令牌。 ApiManager是我的服務的單例類。

我的問題是,userCallback在SplashActivity和LoginActivity中重複。有沒有最佳做法來定義此回調只有一次?用戶回調


定義:

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

回答

1

您可以創建一個名爲UserCallback類,它實現回調並在您想要使用它。

你的情況

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

,當你想使用它:

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

謝謝您的回答。我設法使用call.enqueue進行異步調用(new Callback <>(){})。我的問題是,如果我想在兩個不同的活動中使用相同的回調,最佳做法是什麼? – baptisterobert

+0

我想你應該創建一個名爲UserCallback的類來實現Callback並在你想要的地方使用它。 – humazed

+0

我曾在一個開源的應用程序,我們如何解決這個問題 請看看 https://github.com/fossasia/open-event-android/blob/master/app%2Fsrc%2Fmain%2Fjava%2Forg %2Ffossasia%2Fopenevent%2Fapi%2Fprocessor%2FEventListResponseProcessor.java – humazed