当我想使用 执行者服务. 我只需要创建一个 按钮 和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
}
奇怪的行为是,这个函数中的第一行并没有工作,它只是跳过这一行,等待其他线程返回的结果。它只是跳过这一行,等待其他线程返回的结果。请看下面两张图片。
然而,"Napping...... "的文字可以被设置,如果我简单地删除除了第一行以外的所有内容。启动任务. 谁能帮帮我?非常感谢。
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);
}