引入ExecutorService后,TextView的setText无法工作。

问题描述 投票:0回答:1

当我想使用 执行者服务. 我只需要创建一个 按钮 和a TextView. 我想接近的行为是,当按下Button时,TextView会变成 "Napping... "的文字。然后启动另一个线程,这个线程会随机睡眠一段时间(毫秒)。睡眠后,将返回一个字符串,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

然而,"Napping...... "的文字可以被设置,如果我简单地删除除了第一行以外的所有内容。启动任务. 谁能帮帮我?非常感谢。

java android concurrency textview java.util.concurrent
1个回答
0
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.