【问题标题】:Avoid duplicate retrofit callback避免重复的改造回调
【发布时间】:2016-04-03 17:47:50
【问题描述】:

我在我最新的 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 中重复。是否存在仅定义一次此回调的最佳做法?


用户回调定义:

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

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您可以创建一个名为 UserCallback 的类来实现 Callback 并在需要的地方使用它。

    在你的情况下:

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

    【讨论】:

    • 感谢您的回答。我设法使用 call.enqueue(new Callback() {}) 进行异步调用。我的问题是,如果我想在两个不同的活动中使用相同的回调,最好的做法是什么?
    • 我认为你应该创建一个名为 UserCallback 的类来实现 Callback 并在你想要的地方使用它。
    • 我开发了一个开源应用程序,我们如何解决这个问题,请查看github.com/fossasia/open-event-android/blob/master/…
    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多