2016-04-03 9 views
1

Я внедрил вход в Facebook, используя Модернизацию в своем последнем приложении для Android. В 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

Спасибо за ваш ответ. Мне удалось сделать мой асинхронный вызов с вызовом.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% 2Fпроцессор% 2FEventListResponseProcessor.java – humazed

Смежные вопросы