передача функции в качестве параметра для запуска в потоке пользовательского интерфейса - PullRequest
0 голосов
/ 02 апреля 2020

На самом деле я пытаюсь разработать функцию на Android для вычисления некоторых вещей, однако этот метод может быть (или нет!) Вызван из Задачи. Этот метод должен Toast что-то на каждом шаге, я нашел метод .runOnUiThread(Runnable ...). Написано в моей функции напрямую.

Это работает, но что если в будущем кто-то не захочет тосты и предпочтет обновить полосу загрузки, например? Поэтому я хотел бы знать, возможно ли передать моей функции метод, который будет работать в потоке пользовательского интерфейса, и самый простой способ для пользователя моей функции? Может быть, есть эффективный синтаксис с лямбда-выражением?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Есть несколько способов:

Вы уже упомянули первый способ:

activity.runOnUniThread(Runnable runnable);


Вы также можете использовать следующий метод:

view.post(Runnable runnable);

или:

view.postDelayed(Runnable runnable, int delay);

Пример:

textView.post(r -> { 
    Log.e("Activity" ,"Text"); 
});

Просто напишите свой код в исполняемый файл. Вы даже можете задать его заранее:

Runnable r = new Runnable(r -> {
  // make your stuff
});
// ...
button.post(r);


Последний вариант: Обработчик

Handler handler = new Handler();
// You know the scheme :
handler.post(r);
// or
handler.postDelayed(r, 1000);
0 голосов
/ 02 апреля 2020

Спасибо за ваш ответ, я нашел решение.

У меня есть интерфейс для определения метода action(int x, int y), например. Затем я должен передать аргумент тип этого интерфейса моему методу, и этот метод просто вызывает myInterface.action(..., ...) с обновленными значениями.

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

myMethod(<some others args> ,
                (int x, int y) ->
                        activity.runOnUiThread(() -> { /*Some code */ })
        )

Так что я могу напрямую выбрать, где я вызываю метод, как будет вести себя этот тип обработчика. И в этом случае я использую runOnUiThread(), потому что я в Задаче.

...