Java 计时器停止应用程序
在我的应用程序中,我有一个Java 计时器停止应用程序,java,android,Java,Android,在我的应用程序中,我有一个计时器。但是,当我在计时器内制作一个烤面包片时,应用程序就会崩溃。但当我只增加一个变量时,计时器就工作了 这是我的密码: package com.dev.moritz.colora; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.InputType; import android.view.MotionEvent; impor
计时器
。但是,当我在计时器内制作一个烤面包片时,应用程序就会崩溃。但当我只增加一个变量时,计时器就工作了
这是我的密码:
package com.dev.moritz.colora;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
public class gameActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_game);
startGame();
}
public void startGame() {
Timer ballMovement = new Timer();
ballMovement.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();
}
}, 0, 5000);
}
}
我希望任何人都能帮助我。
莫里茨试试这个:
public void startGame() {
Timer ballMovement = new Timer();
ballMovement.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();
}
});
}
}, 0, 5000);
}
我在我这边试过了,现在效果很好:
您必须具有RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
要解决上述问题,请将方法更改为:
public void startGame() {
Timer ballMovement = new Timer();
ballMovement.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Main2Activity.this, "Round", Toast.LENGTH_SHORT).show();
}
});
}
}, 0, 5000);
}
使用runOnUiThread试试下面的代码
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();
}
});
这是一个您可以尝试的选项
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
private Handler updateUI = new Handler() {
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
Toast.makeText(MainActivity.this, "142", Toast.LENGTH_SHORT).show();
}
};
public void run() {
try {
updateUI.sendEmptyMessage(0);
} catch (Exception e) { e.printStackTrace(); }
}
}, 0, 5000); // time in milliseconds
原因:
任何在非UI线程上运行的任务都无法与UI交互
因此,当您想从计时器任务更新UI时,其中一种方法是使用来自类的代码,将使用的代码片段放入run()方法中:
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(gameActivity.this, "Round", Toast.LENGTH_SHORT).show();
}
});
它将按预期工作。当应用程序崩溃时,请发布错误日志您的日志猫?您的“计时器类阻止主线程”和“无法与UI线程工作或交互”是什么意思?计时器的整体思想是它不会阻塞创建它的线程。当然,您可以使用处理程序与另一个线程的主线程进行交互。不允许在非主线程上执行与UI相关的工作,如计时器
callback@0xDEADC0DE是的,您可以使用runOnUiThread或消息和处理程序与UI交互。
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(gameActivity.this, "Round", Toast.LENGTH_SHORT).show();
}
});