android线程只运行一次

时间:2016-10-24 04:10:03

标签: android multithreading

我只想测试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();
    }
}

2 个答案:

答案 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.
        }
    }
}