首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OnCompleteListener在另一个类中获取结果

OnCompleteListener在另一个类中获取结果
EN

Stack Overflow用户
提问于 2018-06-18 01:56:29
回答 1查看 1.1K关注 0票数 2

我有一个由FragmentAFragmentBMyActivityPresenter组成的MyActivity。FragmentA:

@OnClick(R.id.proceed_sign_up)
public void onBtnProceedSignUp(){
    if(checkInputSignUp()){         
        int returnCode = presenter.createAccount(email, pswd, nick);
        //handle return code: show error on EditTexts,etc.
    }
}

演示者:

public int createAccount(String email, String password, final String nickname) {
    final int[] code = new int[1];
    activity.showLoading(true);
    firebaseUserService.createUserWithEmail(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
                processLogin(task.getResult().getUser(),                   task.getResult().getUser().getProviderData().get(1), nickname);
            } else {
                Log.d("Create not success", task.getException().toString());
                switch (task.getException().getMessage()) {
                    case "The email address is already in use by another account":
                        code[0] = 10;
                        break;
                    default:
                        code[0] = 20;
                        break;
                }
            }
            activity.showLoading(false);
            activity.showLoginFail();
        }
    });
    return code[0];
}

因为操作是异步的,所以当我尝试从Fragment中的createAccount()方法获取returnCode时,Fragment不会完成(所以我总是得到0)。在任务完成或以某种方式重新组织代码后,获取价值的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 02:01:26

最好的方法是在视图中调用一个方法,就像调用showLoading和hideLoading方法时已经做的那样:

 public void createAccount(String email, String password, final String nickname) {
    final int[] code = new int[1];
    activity.showLoading(true);
    firebaseUserService.createUserWithEmail(email, password)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
          @Override
          public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
              processLogin(task.getResult().getUser(),
                  task.getResult().getUser().getProviderData().get(1), nickname);
            } else {
              Log.d("Create not success", task.getException().toString());
              switch (task.getException().getMessage()) {
                case "The email address is already in use by another account":
                  code[0] = 10;
                  break;
                default:
                  code[0] = 20;
                  break;
              }
              activity.showResult(code[0]);
            }
            activity.showLoading(false);
            activity.showLoginFail();
          }
        });
  }

并在你的活动实现的接口中添加:

void showResult(int resultCode);

最后,在实现接口的activity/fragment中,您需要覆盖:

@Override
public void showResult(int resultCode){
//do something with resultCode
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50899160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档