Как приостановить выполнение всей программы, пока в JAVA не будет нажата кнопка? - PullRequest
0 голосов
/ 09 мая 2019

Я делаю приложение для Android, в котором я хочу воспользоваться преимуществами некоторого ранее написанного Java-кода, который полностью написан для самостоятельной работы с собственным методом main.

Когда я вызываю метод mainиз метода onCreate моего MainActivity.java он все еще вызывается нормально.Но вместо того, чтобы взаимодействовать с консолью, я хочу, чтобы метод main () взаимодействовал с EditText, кнопками и представлениями Android. MainActivity и код Java находятся в отдельных классах .

Что я хочу, так это в основном выполнение программы, которая будет остановлена ​​до тех пор, пока я не введу свою запись в EditText и не возобновлю работу, когда я нажму кнопкуи затем возьмите строку, которую я ввел в EditText.Как и в BufferdReader, когда мы вызываем метод reader.readLine (), выполнение останавливается до нажатия клавиши enter, а затем принимает все, что было введено перед нажатием enter.

Существует три вызова функции один за другим 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 ' java пример.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 мая 2019

Android управляется событиями, вы можете заменить поведение promptString на что-то вроде этого: и, конечно, promptString должен иметь контекст Android, сопротивляться в действии или иметь доступ к контексту активности

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, запрашивая ввод, и в то же время передать обработчик обратного вызова, который, когда ввод будет завершен, обратный вызов / отправит обратно ввод значение для использования.

Глядя на метод onAuthorizationStateUpdated() в коде Java, каждый случай переключения должен вызывать этот метод и предоставлять обратный вызов в то же самое время. Таким образом, каждый случай переключения имеет свой собственный обратный вызов, или они могут использовать тот же самый, и вы можете переключить регистр снова по ответу от 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());

должен войти в обратный вызов, вот и ты, надеюсь, это поможет

...