我在 MainActivity 中有这段代码:
boolean running = true;
@Override
public void onClick(View v) {
Button button = (Button)findViewById(R.id.start);
new Thread(new Runnable() {
public void run() {
int secs = 1;
while(running){
Utils.delay(secs, new Utils.DelayCallback() {
int seconds = 0;
TextView licznik = (TextView)findViewById(R.id.licznik);
@Override
public void afterDelay() {
seconds = seconds + 1;
licznik.setText(Integer.toString(seconds));
}
});
}
}
}).start();
}
及其 Utils 类:
import android.os.Handler;
public class Utils {
// Delay mechanism
public interface DelayCallback{
void afterDelay();
}
public static void delay(int secs, final DelayCallback delayCallback){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
delayCallback.afterDelay();
}
}, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
}
}
我在 StackOverflow 上找到了这种方法,但在我单击按钮后它使我的应用程序崩溃怎么了?请帮忙,如果我应该做另一种延迟方法,告诉我哪个错误:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
您正在未调用Looper.prepare()
的后台Thread
上创建一个Handler
,并且还接触了主线程之外的UI组件。
尝试:
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
delayCallback.afterDelay();
}
}, secs * 1000);
看看这是否能解决问题。 但是,无论哪种方式,您都可能会遇到问题,因为while(running)
呼叫将在没有睡眠的情况下触发很多......