当前位置: 首页 > 知识库问答 >
问题:

Android如何等待onComplete方法结束,然后再继续下一个代码

上官高逸
2023-03-14

在进行下一步之前,我想从我的on完成函数中得到一个布尔值。

我的问题是,当代码到达布尔值(isLoginSucces)对代码至关重要的部分时,它会得到唯一的假值,因为onComplete函数没有到达更改布尔值的点。

我尝试了异步函数,但它不起作用,也尝试了原子布尔,也不起作用。

在那之后,我把线放平了。睡眠(10000)。在这段时间(10秒)内,它肯定改变了值,但不要工作太多,仍然是错误的,我不明白。

    private String loginButtonClicked () {

            mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        ...
                        LoginFragment.this.isLoginSucces = true;
                        Log.d("boolean", "boolean value in onComplete: " + isLoginSucces);
                    } else {
                        ...
                        LoginFragment.this.isLoginSucces = false;
                    }
                }
            });

            //HERE I tried Thread.sleep(10000);
            Log.d("boolean", "boolean value after function: " + isLoginSucces);

            if (LoginFragment.this.isLoginSucces)
                return email;
            else
                return null;

    }

日志输出为:

2019-03-29 18:45:12D/boolean:函数后的布尔值:false

2019-03-29 18:45:14 D/布尔值:onComplete中的布尔值:true

共有2个答案

方飞翼
2023-03-14

声明

String str_email = ""; 

在代码的顶部。

插入依赖的代码在完整的方法删除返回语句和更改:

private String loginButtonClicked () {

            mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    ...
                    LoginFragment.this.isLoginSucces = true;
                    Log.d("boolean", "boolean value in onComplete: " + isLoginSucces);
                } else {
                    ...
                    LoginFragment.this.isLoginSucces = false;
                }

               if (LoginFragment.this.isLoginSucces)
                   str_email = email;
               else
                   str_email = ";

        });
}

使用

if(!str_email.equals("")){

//if str_email is different from ""


}
薛弘壮
2023-03-14
public void methodThatCallsLoginButtonClicked() {
    // code before calling loginButtonClicked 

    loginButtonClicked();

    // nothing else that needs the value from login button clicked should be here
}

public void afterLogin(boolean result) {
    // any code that needs the value of the login callback
}

private void loginButtonClicked () {

        mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                afterLogin(task.isSuccessful());
            }
        });

}
 类似资料:
  • 问题内容: 在 puppeteer中, 我想等待定义的时间后再转到下一行代码。 我尝试将a 放入评估函数中,但似乎只是被忽略了 此代码不等待,仅 在等待之前 和 之后 编写 __ 你知道怎么做吗? 问题答案: 您可以使用一点承诺功能, 然后,在需要延迟的任何时候调用它。 如果必须使用操纵符,请使用内置的waitFor函数。 如果仍然要使用page.evaluate,请在4​​秒钟后解决。您没有解决

  • 有什么想法吗?没有JS库。 编辑:我做了几次回拨尝试。老实说,我很难理解他们。下面是我的最后一次尝试:

  • 问题内容: 怎么可能 等到动作完成后再继续循环,我不能得到$ this var,因为它具有最后一个值,对不起我的英语,谢谢!!! 问题答案: 选项1:切换到处理程序中数组中的下一个元素。 选项2:同步发出Ajax请求: 全球: 或直接在请求中: });

  • 问题内容: 为什么每当我将ajax放入for循环中时,它都无法很好地同步? 例如,我的代码是: 为什么它先调用Ajax查询?是否有可能让ajax查询在继续之前完成?因为它在完成填充之前就清除了数组。:/ 问题答案: 首先,您确实需要了解Ajax调用是如何异步的(这就是Ajax中的“ A”所代表的意思)。这意味着调用仅启动ajax调用(它将请求发送到服务器),其余代码愉快地继续运行。有时,在其余代码

  • 问题内容: 我过去一直在努力,今天一直在努力的事情是阻止API / AJAX继续进行,直到您收到响应为止。目前,我正在使用Facebook API。我需要从调用中获取响应,然后将其返回,但是正在发生的事情是,在我从未从API调用中获取响应之前,我的函数正在返回。我知道为什么会这样,我只是想不出如何预防!这是我的代码… // -----编辑 我注意到有人建议这样的事情… 但这返回未定义 //根据更新

  • 本文向大家介绍Java实现等待所有子线程结束后再执行一段代码的方法,包括了Java实现等待所有子线程结束后再执行一段代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现等待所有子线程结束后再执行一段代码的方法。分享给大家供大家参考,具体如下: 今天有一个需求是:在一个方法中开启了一个子线程来执行操作,返回值依赖于子线程的执行结果,这样如果要返回正确的值,就需要开启子线程后