如何暂停整个程序的执行,直到在 JAVA 中按下按钮?

How to pause the execution of the entire program until a button is pressed in JAVA?

我一直在制作一个 android 应用程序,我想在其中利用一些以前编写的 Java 代码,这些代码完全由 运行 自己编写,有自己的 main方法。

当我从 MainActivity.java 的 onCreate 方法调用 main 方法时,它仍然被正常调用。但是我不想与控制台交互,而是希望 main() 方法与 android 的 EditText、按钮和视图交互。 MainActivity 和 Java 代码分开 类.

我想要的基本上是停止程序的执行,直到我在 EditText 中输入我的条目并在我按下按钮然后获取我在 EditText 中输入的字符串时恢复。就像在 BufferdReader 中调用 reader.readLine() 方法一样,执行停止直到按下回车,然后在按下回车之前接收输入的任何内容。

三个函数依次调用到promptString():

            case TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: {
                String phoneNumber = promptString("Please enter phone number: ");
                client.send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler());
                break;
            }
            case TdApi.AuthorizationStateWaitCode.CONSTRUCTOR: {
                String code = promptString("Please enter authentication code: ");
                client.send(new TdApi.CheckAuthenticationCode(code, "", ""), new AuthorizationRequestHandler());
                break;
            }
            case TdApi.AuthorizationStateWaitPassword.CONSTRUCTOR: {
                String password = promptString("Please enter password: ");
                client.send(new TdApi.CheckAuthenticationPassword(password), new AuthorizationRequestHandler());
                break;
            }

每次调用 return 都是一个字符串,然后为 API 调用发送该字符串。如果使用缓冲 reader 代码将停止执​​行,直到有人输入字符串并按回车键并输入正确的值(根据用户),然后由 promptString() 编辑 return 然后已发送至 API 个电话。

我想在 android 中复制这个缓冲的 reader 类型的功能,当 promptString() 被调用时,程序会一直等到用户输入编辑文本并且按下按钮时然后按下 promptString() return 字符串,然后继续执行。

现在正在发生的事情是,执行过程没有让用户有机会输入编辑文本,因此错误的(空字符串)值被发送到 API 调用,从而导致错误。

promptString() 负责获取输入并return输入字符串的代码(未修改):

private static String promptString(String prompt) {
        System.out.print(prompt);
        currentPrompt = prompt;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = "";
        try {
            str = reader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        currentPrompt = null;
        return str;
    }

我知道我的要求非常不合常规且愚蠢,但我需要这个,因为我正面临一些截止日期,而且我没有时间完全理解 API 调用。

如果您不清楚问题,请评论您希望详细说明的部分。

我愿意接受与我的不完全相同的解决方案,但会完成我正在寻找的工作并帮助我让程序等待,直到用户在编辑文本中输入完字符串。

我正在使用 the telegram api's java example

请帮忙。

Android 是事件驱动的,你可以用这样的东西替换 promptString 行为:当然 promptString 必须有 Android 上下文,在一个Activity 或有权访问 Activity 上下文

private void promptString(String prompt, callback) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(prompt);

    // Set up the input
    final EditText input = new EditText(this);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
    builder.setView(input);

    // Set up the buttons
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            callback.setValue(input.getText().toString());
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();
}

您可以按原样使用 Java 代码,但您必须修改一些代码并调用 Android 请求输入,同时移交一个回调处理程序,当输入完成后,将 callback/send 返回要使用的输入值。

查看 java 代码中的 onAuthorizationStateUpdated() 方法,每个 switch case 都必须调用此方法并在同一位置提供回调。 所以每个 switch case 都有自己的回调,或者它们可以使用相同的回调,你可以通过 AlertDialog 的响应再次切换 case,当然你需要一些标识符,使用不同的回调处理程序可能更容易

    case TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: {
                    String phoneNumber = yourAndroidContextActivity.promptString 
   ("Please enter phone number: ", callback);
                    break;
                }

代码:

 client.send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler());

必须进入回调,你去吧希望它有帮助