我们创建了线程在界面Destroy的时候必须将其Stop掉,
如果写的不是死循环那还好,当它运行结束时,系统会帮我们擦屁股
如果写的是死循环恭喜你,它将一直运行下去...
我们要牢记,界面被销毁,线程不一定会被销毁
不信你就打Log看看,虽然界面退出,仍然在打Log
当你再打开程序时,现在的那个Thread就不是原先那个Thread的,因为是Thread是new出来的啊
所以,你再执行时就有2个线程在跑哦。
如果是多线程或者线程不是死循环就一般不用考虑,但是你是不是要精益求精呢?...
如果写的不是死循环那还好,当它运行结束时,系统会帮我们擦屁股
如果写的是死循环恭喜你,它将一直运行下去...
我们要牢记,界面被销毁,线程不一定会被销毁
不信你就打Log看看,虽然界面退出,仍然在打Log
当你再打开程序时,现在的那个Thread就不是原先那个Thread的,因为是Thread是new出来的啊
所以,你再执行时就有2个线程在跑哦。
标准的线程写法是
public class MainActivity extends Activity {
//控制打开关闭线程的按钮
Button mBtnStart, mBtnEnd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnStart = (Button) findViewById(R.id.start_main);
mBtnEnd = (Button) findViewById(R.id.end_main);
//创建线程
MyThread mThread = new MyThread();
mBtnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mThread.setStart();
}
});
mBtnEnd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mThread.setStop();
}
});
}
//Destroy的时候将其Stop掉
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mThread.setStop();
}
}
public class MyThread extends Thread{
//线程开关
boolean flag;
//留出一个控制线程开启的接口
public void setStart(){
flag = true;
start();//启动线程
}
//留出一个控制线程关闭的接口
public void setStop(){
flag = false;
}
@Override
public void run() {
int i = 0;
//true就跑起线程
while(flag){
try {
Thread.sleep(1000);
i++;
Log.i("log", "MyThread if running ---->" + i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
如果是多线程或者线程不是死循环就一般不用考虑,但是你是不是要精益求精呢?...
请关注下一篇,线程与服务