Может ли Runnable вернуть значение? - PullRequest
6 голосов
/ 21 октября 2011

Возможно ли для Runnable вернуть значение?Мне нужно сделать некоторую интенсивную работу над редактируемым и затем вернуть его обратно.Вот мой фиктивный код.

public class myEditText extends EditText {
...
private Editable workOnEditable() {
    final Editable finalEdit = getText();
    Thread mThread = new Thread(new Runnable() {
        public void run() {


              //do work

              //Set Spannables to finalEdit

        }
     });
    mThread.start();
    return finalEdit;
}
...
}

Так что, очевидно, моя первая проблема - я пытаюсь изменить finalEdit, но он должен быть окончательным, чтобы получить доступ к нему и из потока, верно?Как правильно это сделать?

Ответы [ 4 ]

2 голосов
/ 21 октября 2011

В Java Runnable не может «возвращать» значение.

В частности, в Android лучший способ справиться с вашим типом сценария - AsyncTask . Это универсальный класс, поэтому вы можете указать тип, который вы хотите передать, и тип, который возвращается в функцию onPostExecute.

В вашем случае вы бы создали AsyncTask<Editable, Void, TypeToReturn>. Что-то вроде:

private class YourAsyncTask extends AsyncTask<Editable, Void, Integer> {
     protected Long doInBackground(Editable... params) {
         Editable editable = params[0];
         // do stuff with Editable
         return theResult;
     }

     protected void onPostExecute(Integer result) {
         // here you have the result
     }
 }
1 голос
/ 21 октября 2011

Вы понимаете, что поток продолжает работать после завершения функции workOnEditable (), верно?Если вы хотите синхронный ответ, избавьтесь от потока.Если нет, используйте обработчик для передачи данных обратно в основной поток.

1 голос
/ 21 октября 2011

Следующее существует просто для того, чтобы указать на использование «псевдо-замыканий» в Java, поскольку не подходит , как они могут быть в этом случае.


Java допускает псевдо-замыкания через изменяемые типы, хранящиеся в конечных переменных.

См. Псевдо-замыкания Java Кристофера Мартина. Перейти к разделу «Подделка». Он вводит изменчивый тип ValueHolder<T>:

private static class ValueHolder<T> {
  T value;
}
...
final ValueHolder<Integer> i = new ValueHolder<Integer>();
...
i.value = 42;

Удачного кодирования.

0 голосов
/ 13 октября 2015

Я создал 2 вспомогательных метода для Runnable, которые позволяют публиковать runnable и блокировать до тех пор, пока вы не получите результат.

Вы можете посмотреть здесь: https://github.com/Petrakeas/HVTHandler/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...