2016-04-03 49 views
1

最新のAndroidアプリケーションでRetrofitを使用してFacebookログインを実装しました。 SplashActivityとLoginActivityでは、私は私のPOSTリクエストを作りたい:重複するコールバックを避ける

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

FacebookLoginInfoは、Facebookのアクセストークンを持つ単純なPOJOです。 ApiManagerは私のサービスのためのシングルトンクラスです。

私の問題は、userCallbackがSplashActivityとLoginActivityに重複していることです。このコールバックを1回だけ定義するのがベストプラクティスですか?ユーザー・コールバックの


定義:

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 <>(){})を使用して非同期呼び出しを行うことができました。私の質問は、2つの異なるアクティビティで同じコールバックを使用したい場合、ベストプラクティスは何ですか? – baptisterobert

+0

私はあなたがコールバックを実装し、あなたが欲しいところでそれを使用するUserCallbackと呼ばれるクラスを作成すべきだと思います。 – humazed

+0

私はオープンソースのアプリケーションに取り組みました。この問題の解決方法は です。 https://github.com/fossasia/open-event-android/blob/master/app%2Fsrc%2Fmain%2Fjava%2Forg %2Ffossasia%2Fopenevent%2Fapi%2Fprocessor%2FEventListResponseProcessor.java – humazed