android多線程編程(Thread,Handle,AsycTask)

人生主幹道只有一條,如同android的主線程,而路上的風景值得欣賞,無論走多遠,請記得回家的路。這便是 Thread,Handle和AsycTask

  1. 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的使用

完。

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