TextView setText не работает после введения ExecutorService - PullRequest
0 голосов
/ 29 апреля 2020

Я столкнулся с этой проблемой, когда хочу использовать 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

enter image description here

Тем не менее, текст «Napping ...» может быть установлен, если я просто удаляю все кроме Первая строка из startTask . Может кто-нибудь мне помочь? Большое спасибо.

1 Ответ

0 голосов
/ 29 апреля 2020

Обработчик Android лучше подходит для таких целей, как это, используйте его как:

public void startTask(View view) {
    long sleeptime = 10 * 1000;//10 seconds
    mTextView.setText("Napping...");
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            mTextView.setText("Awake at last after sleeping for " + sleeptime + " milliseconds!"); 
        }
    }, sleeptime);
}

или вы можете просто сделать:

public void startTask1(View view) {
    long sleeptime = 10 * 1000;//10 seconds
    mTextView.setText("Napping"); 
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            mTextView.setText("Awake at last after sleeping for " + sleeptime + " milliseconds!");
        }
    }, sleeptime);
}
...