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

Posted

技术标签:

【中文标题】如何暂停整个程序的执行,直到在 JAVA 中按下按钮?【英文标题】:How to pause the execution of the entire program until a button is pressed in JAVA? 【发布时间】:2019-09-27 16:53:36 【问题描述】:

我一直在制作一个 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;
            

每个调用都会返回一个字符串,然后将其发送给 API 调用。如果使用缓冲阅读器,代码将停止执​​行,直到有人输入字符串并按下回车键并输入正确的值(根据用户),然后由promptString() 返回,然后发送到 API 调用。

我想在 android 中复制这种缓冲读取器类型功能,当调用 promptString() 时,程序会等待,直到用户输入编辑文本,当按下按钮时,promptString() 返回字符串,然后进一步执行进行中。

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

promptString() 负责接受输入并返回输入字符串的代码(未修改):

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 的java example。

请帮忙。

【问题讨论】:

你必须 - 好吧 - 暂停执行并等待。没有什么神奇的方法可以停止 JVM(除非你为此使用调试机制) 这不是 Android 应用程序开发的工作方式。与大多数现代 UI 工具包一样,Android 的 UI 框架是事件驱动的,可以避免阻塞调用,就像您寻求的那样。 我知道做我想做的事情既不传统也不愚蠢,但我需要在很短的时间内在我的应用程序中使用 java 代码的全部功能。所以我想在这里强求。 【参考方案1】:

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 请求输入,同时移交一个回调处理程序,当输入完成时,该处理程序将回调/发回输入使用价值。

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

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

代码:

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

必须进入回调,希望对你有帮助

【讨论】:

请再看一遍这个问题,我做了一些修改,让它更清楚。感谢您的回复。 我稍微改变了我的答案,看看,您可以按原样使用 Java 代码,但您必须修改一些并调用 Android 要求输入,同时交出回调处理程序,当输入完成时,将回调/发回输入值以在中使用

以上是关于如何暂停整个程序的执行,直到在 JAVA 中按下按钮?的主要内容,如果未能解决你的问题,请参考以下文章

播放器控制器在 tvOS 中按下菜单按钮时关闭

在位置访问权限中按下允许按钮后如何执行操作?

如何保存迭代编号。在matlab中按下按键

在 PyQt5 中按下时如何切换按钮文本

在swift3中按下按钮时如何以编程方式执行segue或呈现视图

如何在一段时间内重复一个过程,直到按下输入?