java - 引入ExecutorService后TextView setText不起作用

标签 java android concurrency textview java.util.concurrent

当我想使用ExecutorService时,我遇到了这个问题。我只是创建一个 Button 和一个 TextView。我想要实现的行为是,当按下按钮时,TextView 更改为文本“Napping...”。另一个线程启动,它将 hibernate 一段随机时间(毫秒)。 sleep 后,将返回一个字符串,并将 TextView 设置为该字符串。

这是将用于 SingleThreadExecutor 的 Callable 类。

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

但是,如果我简单地从 startTask 中删除除第一行之外的所有内容,则可以设置“Napping...”文本。谁能帮我?非常感谢。

最佳答案

Android Handler更好的是适合这样的目的,使用它如下:

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);
}

关于java - 引入ExecutorService后TextView setText不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61508061/

相关文章:

java - 如何确定对象属性断言的主语和客体?

java - javac 会生成静态桥接方法吗?

android - Android Studio 中的多个项目

java - 对 AsyncTask 中的 UI 操作进行故障排除(OnProgressDialog、Toasts)

Java 线程死锁示例

java - 如何正确处理并发?

java - 如何启动一个java程序?

android - 从广播接收器更新应用程序状态(全局变量)

haskell - 在 Haskell 中测试异步异常下的正确性

java - Android studio "java.lang.OutOfMemoryError"模拟器 redmi 2 prime kitkat