1 繼承Thread類多線程
2 實現Runnable接口大數據
二者區別:線程
前者表明一個線程code
後者表明線程體,也就是線程要執行的代碼。繼承
多線程同步接口
多個線程同時訪問一個資源,爲了不出現錯誤,就要實現線程同步。 讓這個資源一次只能被一個線程訪問。圖片
MainThread=主線程=UI線程資源
除此以外的線程叫WorkerThread同步
全部UI由主線程操做it
可能產生阻塞的操做放在Worker Thread中操做
大多數狀況下WorkerThread不能操做UI
在安卓中,本身建立出來的線程都叫WorkerThread,因此,除此以外,咱們全部的操做都是在MainThread中進行的。
下面這個實驗用來證實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方法
Worker Thread雖然不能操做UI,可是它有其餘做用:
處理那些可能引起阻塞的操做,如大數據處理。
由於,若是這些可能引起阻塞的操做若是在主線程中處理的話,就可能會引起ANR問題。
下面經過一個例子再現這個ANR問題。
例子實現的是:
在主線程中,點擊按鈕,直接休眠10秒,期間頻繁點擊屏幕,就會出現ANR提示框。
按鈕監聽器類:
class ButtonListener implements OnClickListener { public void onClick(View v) { try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
點擊按鈕,屏幕卡住,再點幾下屏幕,10秒後: