1、耗時操作都需要使用到線程。
2、開啓線程的活動結束後線程未被關閉的話依舊在運行
1)線程的常規操作
代碼如下:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Log.e("MainActivity", "頁面1創建");
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//傳建一個計數線程,每個1S 計數
new Thread(new Runnable() {
@Override
public void run() {
int num = 0;
Log.e("MainActivity", "線程開始");
while (true) {
try {
Thread.sleep(1000);
Log.e("MainActivity", "記數開始:" + num);
num++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Log.e("MainActivity", "線程結束"); //循環條件爲true 死循環時 後面代碼會報錯
}
}).start();
}
});
}
@Override
protected void onStop() {
super.onStop();
Log.e("MainActivity", "頁面1onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("MainActivity", "頁面1結束");
}
打印log如下:
01-11 14:17:27.588 26204-26204/com.leixiansheng.test E/MainActivity: 頁面1創建
01-11 14:17:34.120 26204-26229/com.leixiansheng.test E/MainActivity: 線程開始
01-11 14:17:35.121 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:0
01-11 14:17:36.122 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:1
01-11 14:17:37.123 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:2
01-11 14:17:37.465 26204-26204/com.leixiansheng.test E/MainActivity: 頁面2創建
01-11 14:17:37.819 26204-26204/com.leixiansheng.test E/MainActivity: 頁面1onStop
01-11 14:17:38.124 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:3
01-11 14:17:39.124 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:4
01-11 14:17:40.125 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:5
01-11 14:17:40.505 26204-26204/com.leixiansheng.test E/MainActivity: 頁面2結束
01-11 14:17:41.126 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:6
01-11 14:17:42.127 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:7
01-11 14:17:43.079 26204-26204/com.leixiansheng.test E/MainActivity: 頁面1onStop
01-11 14:17:43.079 26204-26204/com.leixiansheng.test E/MainActivity: 頁面1結束
01-11 14:17:43.128 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:8
01-11 14:17:44.128 26204-26229/com.leixiansheng.test E/MainActivity: 記數開始:9
從操作可以看出,開啓線程後,進入其他頁面線程依舊可以運行。並且有個問題,退出程序後線程還在運行,必須手動殺死程序進程,線程纔會停止。(這樣就會造成線程泄漏)
2)爲了保證程序結束時也停止線程,我們可以引入 volatile 線程標識符
代碼如下:
private volatile boolean isStop = false; //線程停止標識符
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Log.e("MainActivity", "頁面1創建");
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//傳建一個計數線程,每個1S 計數
new Thread(new Runnable() {
@Override
public void run() {
int num = 0;
Log.e("MainActivity", "線程開始");
while (!isStop) {
try {
Thread.sleep(1000);
Log.e("MainActivity", "記數開始:" + num);
num++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.e("MainActivity", "線程結束"); //循環條件爲true 死循環時 後面代碼會報錯
}
}).start();
}
});
}
@Override
protected void onStop() {
super.onStop();
Log.e("MainActivity", "頁面1onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
isStop = true;
Log.e("MainActivity", "頁面1結束");
}
打印log如下:
01-11 14:41:10.755 27113-27113/com.leixiansheng.test E/MainActivity: 頁面1創建
01-11 14:41:22.010 27113-27149/com.leixiansheng.test E/MainActivity: 線程開始
01-11 14:41:23.012 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:0
01-11 14:41:24.012 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:1
01-11 14:41:24.816 27113-27113/com.leixiansheng.test E/MainActivity: 頁面2創建
01-11 14:41:25.013 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:2
01-11 14:41:25.168 27113-27113/com.leixiansheng.test E/MainActivity: 頁面1onStop
01-11 14:41:26.014 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:3
01-11 14:41:27.014 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:4
01-11 14:41:28.015 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:5
01-11 14:41:28.022 27113-27113/com.leixiansheng.test E/MainActivity: 頁面2結束
01-11 14:41:29.016 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:6
01-11 14:41:30.016 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:7
01-11 14:41:31.017 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:8
01-11 14:41:31.135 27113-27113/com.leixiansheng.test E/MainActivity: 頁面1onStop
01-11 14:41:31.136 27113-27113/com.leixiansheng.test E/MainActivity: 頁面1結束
01-11 14:41:32.018 27113-27149/com.leixiansheng.test E/MainActivity: 記數開始:9
01-11 14:41:32.018 27113-27149/com.leixiansheng.test E/MainActivity: 線程結束
從日誌可以看出。開始線程後,進入其他頁面線程依舊在運行,程序退出後線程也隨程序結束。