Android runOnUiThread 未执行
Android runOnUiThread not executing
我有这个问题。我正在尝试从另一个线程更新我的 TextView
,但它不允许我这样做。
我尝试了很多不同的解决方案,但其中 none 似乎没有用。在我的 while 循环代码中一直打印 "Started new loop",但它不会从 runOnUiThread
继续。
谁能帮我弄清楚如何从另一个线程更新 TextView
?
//second thread
protected void startKakkosThread() {
Thread t2 = new Thread() {
public void run() {
while (true) {
System.out.println("Started new loop");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if(rullaavaNumero >= 0) {
rullaavaNumero--;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
sleep(1000);
}else{
rullaavaNumero = 9;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
sleep(1000);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
});
}
}
};
t2.start();
}
这是一个快速解决方法,您有一个无限循环,其运行速度比线程有机会(时间)启动的速度快。因此,即使这样,您也可以使用 if 语句在线程中进行睡眠,如果线程从未启动,则睡眠无效。
而且你在 Thread 中的睡眠不会像这样工作。您想延迟无限 while 循环,因此您需要将 sleep on 移出 while 循环中的线程。
仍然可以通过在其中添加额外的睡眠来延迟您的线程,但这一切都取决于您想要实现的目标。
您的最终代码如下所示:
protected void startKakkosThread() {
Thread t2 = new Thread() {
public void run() {
while (true) {
System.out.println("Started new loop");
runOnUiThread(new Runnable() {
@Override
public void run() {
if (rullaavaNumero >= 0) {
rullaavaNumero--;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
// no need for sleep here
// sleep(1000);
} else {
rullaavaNumero = 9;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
// no need for sleep here
// sleep(1000);
}
}
});
// add this part
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t2.start();
}
我已经测试过了,它可以工作,你也可以按照@cricket 的建议去做。
我看到了另一个问题,这不是你问题的一部分,但值得一提。我假设您想从 9
计数到 0
,如果是这种情况,您需要通过删除 =
来更正以下行,否则您会计数到 -1
,所以您的代码行将如下所示:
if(rullaavaNumero > 0) {...
我有这个问题。我正在尝试从另一个线程更新我的 TextView
,但它不允许我这样做。
我尝试了很多不同的解决方案,但其中 none 似乎没有用。在我的 while 循环代码中一直打印 "Started new loop",但它不会从 runOnUiThread
继续。
谁能帮我弄清楚如何从另一个线程更新 TextView
?
//second thread
protected void startKakkosThread() {
Thread t2 = new Thread() {
public void run() {
while (true) {
System.out.println("Started new loop");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if(rullaavaNumero >= 0) {
rullaavaNumero--;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
sleep(1000);
}else{
rullaavaNumero = 9;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
sleep(1000);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
});
}
}
};
t2.start();
}
这是一个快速解决方法,您有一个无限循环,其运行速度比线程有机会(时间)启动的速度快。因此,即使这样,您也可以使用 if 语句在线程中进行睡眠,如果线程从未启动,则睡眠无效。
而且你在 Thread 中的睡眠不会像这样工作。您想延迟无限 while 循环,因此您需要将 sleep on 移出 while 循环中的线程。
仍然可以通过在其中添加额外的睡眠来延迟您的线程,但这一切都取决于您想要实现的目标。
您的最终代码如下所示:
protected void startKakkosThread() {
Thread t2 = new Thread() {
public void run() {
while (true) {
System.out.println("Started new loop");
runOnUiThread(new Runnable() {
@Override
public void run() {
if (rullaavaNumero >= 0) {
rullaavaNumero--;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
// no need for sleep here
// sleep(1000);
} else {
rullaavaNumero = 9;
System.out.println(rullaavaNumero);
pelaajanPisteetTeksi.setText("" + rullaavaNumero);
// no need for sleep here
// sleep(1000);
}
}
});
// add this part
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t2.start();
}
我已经测试过了,它可以工作,你也可以按照@cricket 的建议去做。
我看到了另一个问题,这不是你问题的一部分,但值得一提。我假设您想从 9
计数到 0
,如果是这种情况,您需要通过删除 =
来更正以下行,否则您会计数到 -1
,所以您的代码行将如下所示:
if(rullaavaNumero > 0) {...