線程使用簡介

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: 線程結束

從日誌可以看出。開始線程後,進入其他頁面線程依舊在運行,程序退出後線程也隨程序結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章