人生主幹道只有一條,如同android的主線程,而路上的風景值得欣賞,無論走多遠,請記得回家的路。這便是 Thread,Handle和AsycTask
- Thread的使用
Android多線程編程和java多線程編程基本類似,定義一個線程只需新建一個類繼承Thread,然後重寫run()方法。
1.1:創建自定義的類繼承Thread
public class MyThread extends Thread {
private static final String TAG = "MyThread";
@Override
public void run() {
super.run();
Log.i(TAG, "run: MyThread is running");
}
}
調用的時候使用
new MyThread().start();//完成調用
1.2:創建自定義的類實現Runnable
接口
public class MyOtherThread implements Runnable{
private static final String TAG = "MyOtherThread";
@Override
public void run() {
//處理事件的方法
Log.i(TAG, "run: MyOtherThread is running");
}
}
調用的方法
//說明:Thread的調用裏面需要傳遞一個runnable對象,我們的類已經實現了該方法,所以只需要進行傳入使用就好
MyOtherThread myOtherThread = new MyOtherThread();
Thread otherThread = new Thread(myOtherThread);
otherThread.start();
Log.i(TAG, "onCreate: otherThread"+otherThread.currentThread().getId()+"***"+otherThread.currentThread().getName());
1.3:使用匿名類直接進行處理
//啓動一個子線程,匿名的方法類
new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: ThreadRunnable is running");
}
}).start();
以上是多線程編程的基本使用方法,java
也是如此的。
2 . 在子線程中更新UI
Android的UI的線程並不是安全的,也就是說要更新應用的UI元素,必須在主線程中進行,否則會拋出異常。簡言之,在子線程中你可以進行邏輯處理,但是涉及到UI的更新操作,你只能在主線程中進行。
2.1:基於上述的原因,在android中使用Thread
的時候都是和Handler
一起結合工作。
public class MainActivity extends AppCompatActivity {
public static final int UPDATE_TEXT = 1;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case UPDATE_TEXT:
textView.setText("update done");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//******************************
}
/**
* 點擊按鈕之後進行數據處理
*/
public void ButtonOnclick(){
//那麼我麼在點擊之後啓動一個子線程來完成數據的更新
/*錯誤示例*/
/*new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子線程更新Ui");
}
}).start();*/
/*正確示例*/
new Thread(new Runnable() {
@Override
public void run() {
//發送Message對象
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
}
}
以上便是相應的方法,會使用並不是我們的最終目標,下面來說說android異步處理機制
3 . android異步處理機制:(Message/Handler/MessageQueue/Looper)
3.1 :Message 是在線程之間傳遞的消息,可以在內部攜帶少量的信息,用於在不同線程之間交換數據。
3.2:MessageQueue 消息隊列,主要存放所有通過handler發送的消息
3.3:Looper:相當於MessageQueue的管家,調用Looper.loop()方法後,就會進入一個無限循環的狀態,然後每當發現MessageQueue中存在一條消息,就會將其取出,並傳遞到Handler的handleMessage()方法中
3.4:Handler 處理者
在此附一張圖來直觀的看看工作原理:聲明該圖片參考郭霖的書籍《第一行代碼》第二版中關於線程講解一書
4 .AsycTask的使用方法(後面的blog中會在service進行詳細講解並使用)關於service的使用
完。