我只想测试Log.i()
并查看android studio中的控制台。在下面的代码onResume
应该启动thread
,而run()
应该在监视器中使用标记“run”编写无穷无尽的“dings”。但是run方法显然只被调用一次。为什么呢?
public class MainActivity extends Activity implements Runnable {
Thread gameThread = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("onCreate","getting started");
}
public void run() {
Log.i("run","ding");
}
@Override
public void onResume() {
super.onResume();
gameThread = new Thread(this);
gameThread.start();
}
}
答案 0 :(得分:1)
你错过了线程真正做的概念。它允许您异步运行一个工作单元。因此,所有相同的正常规则都适用。它只运行一次的原因是因为线程在run()
返回后退出。所以就像任何其他方法一样,你应该添加像
while(true)
{
Log.i("run","ding");
}
在run()
内。理想情况下,您实际上会检查一些条件,以便您可以根据需要退出线程。
最后,让MainActivity
实施Runnable
可能是个坏主意。通常,使用自己的类实现线程是一种好的方式,例如DingThread implements Runnable
。
答案 1 :(得分:1)
你错过了while
循环,为什么它只运行一次。使用以下代码。这是使用线程概念的更好方法。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("onCreate","getting started");
}
@Override
public void onResume() {
super.onResume();
startThread();// create thread obj and start
}
private GameThread mGameThread = null;
private void startThread() {
stopThread();// if thread already running stop it then create new thread and start (for avoiding multi-threading).
mGameThread = new GameThread();
mGameThread.start();//start the thread.
}
//To stop the thread simply call this method.
private void stopThread() {
if(mGameThread != null) {
mGameThread.setStop();
mGameThread = null;
}
}
private class GameThread extends Thread {
private boolean mIsStop;// mIsStop is default false
@Override
public void run() {
while (!mIsStop) { // if mIsStop is false then only come inside loop.
Log.i("run","ding"); //log will print
}
}
public void setStop() {
mIsStop = true;// set mIStop variable to true.
}
}
}