Я столкнулся с этой проблемой, когда хочу использовать ExecutorService . Я просто создаю Button и TextView . Поведение, к которому я хочу обратиться, заключается в том, что при нажатии кнопки TextView изменяется на текст «Napping ...». И запускается другой поток, который будет спать в течение некоторого случайного времени (миллисекунды). После сна будет возвращена строка и TextView будет установлен на это.
Вот класс Callable, который будет использоваться для SingleThreadExecutor.
package com.example.simpleasynctask;
import java.util.Random;
import java.util.concurrent.Callable;
public class MyWorkThread implements Callable<String> {
@Override
public String call() throws Exception {
Random r = new Random();
int n = r.nextInt(11);
int s = n*200;
try {
Thread.sleep(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Awake at last after sleeping for " + s + " milliseconds!";
}
}
А вот функция, которая будет вызываться при нажатии кнопки
public void startTask(View view) throws Exception{
mTextView.setText(R.string.napping); // it does not work
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future future = executorService.submit(mCallable);
executorService.shutdown();
mTextView.setText((String) future.get()); // it works
}
Странное поведение в том, что первая строка в этой функции не работает. Он просто пропускает эту строку и ждет результата, возвращенного другим потоком. Смотрите две картинки ниже. ![enter image description here](https://i.stack.imgur.com/ErMXM.png)
![enter image description here](https://i.stack.imgur.com/xyugJ.png)
Тем не менее, текст «Napping ...» может быть установлен, если я просто удаляю все кроме Первая строка из startTask . Может кто-нибудь мне помочь? Большое спасибо.