Android線程——Mars Android開發視頻之第二季第五集(重)

1.回顧JAVA中的線程

  • 線程的兩種實現方式

1 繼承Thread類多線程

2 實現Runnable接口大數據

二者區別:線程

  • 前者表明一個線程code

  • 後者表明線程體,也就是線程要執行的代碼。繼承

  • 多線程同步接口

多個線程同時訪問一個資源,爲了不出現錯誤,就要實現線程同步。 讓這個資源一次只能被一個線程訪問。圖片

2. MainThread與WorkerThread

  • MainThread=主線程=UI線程資源

  • 除此以外的線程叫WorkerThread同步

  • 全部UI由主線程操做it

  • 可能產生阻塞的操做放在Worker Thread中操做

  • 大多數狀況下WorkerThread不能操做UI

在安卓中,本身建立出來的線程都叫WorkerThread,因此,除此以外,咱們全部的操做都是在MainThread中進行的。

下面這個實驗用來證實WorkerThread中不能操做UI:

2.1 WorkerThread中不能操做UI:

具體的實現是:

點擊按鈕,啓動一個線程; 在這個線程中,將試圖修改文本域的內容;

輸入圖片說明

線程內部類: 修改文本域內容

class MyThread extends Thread {
		public void run(){
			try {
				Thread.sleep(2 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			textView_1.setText("OK");
		}
	}

按鈕監聽器類: 建立啓動WorkerThread線程

class ButtonListener implements OnClickListener {
		public void onClick(View v) {
			new MyThread().start();
		}
	}

點擊按鈕的結果: 提示只有在擁有建立View權限的原始線程(主線程)中才能操做View。

輸入圖片說明

但一些特殊的組件能夠在WorkerThread中被操做,如: · progressbar的setProgress方法

2.2 WorkerThread的做用

Worker Thread雖然不能操做UI,可是它有其餘做用:

處理那些可能引起阻塞的操做,如大數據處理。

由於,若是這些可能引起阻塞的操做若是在主線程中處理的話,就可能會引起ANR問題。

  • ANR:應用程序未響應(Application Not Responding)

下面經過一個例子再現這個ANR問題。

例子實現的是:

在主線程中,點擊按鈕,直接休眠10秒,期間頻繁點擊屏幕,就會出現ANR提示框。

按鈕監聽器類:

class ButtonListener implements OnClickListener {
		public void onClick(View v) {
			try {
				Thread.sleep(10 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

點擊按鈕,屏幕卡住,再點幾下屏幕,10秒後:

輸入圖片說明

相關文章
相關標籤/搜索