Android 多線程編程

Android 多線程編程
文章目錄
線程的調用
實現Runnable接口定義一個線程
使用匿名內部類的方法啓動子線程
在子線程中更新主線程參數
異步信息處理機制
使用異步信息處理機制
解析異步信息處理機制
AsyncTask
使用AsyncTask
線程的調用
實現Runnable接口定義一個線程
class MyThread implements Runnable
{

@Override
public void run()
{
    //處理具體的邏輯
}

}

啓動MyThread

MyThread myThread = new MyThread();
new Thread(myThread).start();
1
2
使用匿名內部類的方法啓動子線程
new Thread(

new Runnable()
{
    @Override
    public void run()
    {
        //處理具體的邏輯
    }
}

).start();

在子線程中更新主線程參數
子線程不能直接修改主線程中的變量,否者會出現異常。

異步信息處理機制
使用異步信息處理機制
首先定義一個整形常量UPDATE_DATA。

public static final int UPDATE_DATA = 1;
1
新增一個Handler對象,並重寫父類的handleMessage()方法。

private Handler handler = new Handler()
{

public void handleMessage(Message msg)
{
    switch (msg.what)
    {
        case UPDATE_DATA:
            //這裏可以進行主線程中的變量操作
            
            break;
        
        default:
            break;
    }
}

}

在單擊事件中開啓子線程,在“具體的邏輯”執行完成後,創建一個Message對象,將Message對象的what字段的值指定爲UPDATE_DATA,將Message對象發送出去。
很快,Handler就會收到這條Message,並在handleMessage()方法中對它進行處理。

new Thread(

new Runnable()
{
    @Override
    public void run()
    {
        //處理具體的邏輯
        Message message = new Message(); //創建一個Message對象
        message.what = UPDATE_DATA; //將Message對象的what字段的值指定爲UPDATE_DATA
        handler.sendMessage(message); //將Message對象發送出去
    }
}

).start();

解析異步信息處理機制
AsyncTask
對於在子線程中使用主線程中的變量,Android提供了一個更方便的工具:AsyncTask。
即使對異步消息處理機制完全不瞭解,也可以十分簡單的從子線程切換到主線程。

使用AsyncTask
AsyncTask是一個抽象類,在繼承時我們可以爲AsyncTask類指定3個泛型參數。
Params:在執行AsyncTask時,需要傳入的參數,可用於在後臺任務中使用
Progress:後臺任務執行時,如果需要再界面上顯示當前進度,則使用這裏指定的泛型作爲進度單位。
Result:當任務執行完畢後,如果需要對結果進行返回,則使用這裏指定的泛型作爲返回值類型。

//Void:表示在執行AsyncTask的時候不需要傳入參數給後臺任務
//Integer:表示使用整型數據來作爲進度顯示單位
//Boolean:表示使用布爾型數據來反饋執行結果
class DownloadTask extends AsyncTask
{

...

}

重寫AsyncTask中的幾個方法,完成對任務的定製
doInBackground():中執行具體的耗時任務
onProgressUpdate():中進行主線程變量操作
onPostExecute():中做執行一些任務的收尾工作

class DownloadTask extends AsyncTask
{

@Override
protect void onPreExecute()
{
    /*
     *這個方法會在後臺任務開始執行之前調用,
     *用於進行一些界面上的初始化操作,
     *比如顯示一個進度條對話框等。
     */
}

@Override
protect Boolean doInBackground(Void ... params)
{
    /*
     *這個方法中的所有代碼都會在子線程中運行,我們應該在這裏去處理所有耗時任務。
     *任務一旦完成,就可以通過return語句來將任務的執行結果返回。
     *如果AsyncTask的第三個泛型參數指定的是Void,則可以不返回任務執行結果。
     *
     *在這個方法中不可以對主線程的變量進行操作。
     */
     
     //用於調用opProgressUpdate()方法
     publishProgress(Progress ...);
}

@Override
protect void onProgressUpdate(Integer ... values)
{
    /*
     *當後臺任務中調用了publishProgress(Progress ...)方法後,
     *onProgressUpdate(Progress ...)方法很快就會被調用。
     *該方法中攜帶的參數是在後臺任務中傳遞過來的。
     *
     *在這個方法中可以對主線程的變量進行操作。
     */
}

@Override
protect void onPostExecute(Boolean result)
{
    /*
     *當後臺任務執行完畢,並通過return語句進行返回時,
     *這個方法很快就會被調用。
     *返回的數據會作爲參數傳遞到此方法中,
     *可以利用返回的數據做一些對主線程變量的操作。
     */
}

}

如果想要啓動這個任務,只需要編寫以下代碼即可:

new DownloadTask().execute();

作者:zzsj1990
來源:CSDN
原文:https://blog.csdn.net/zzsj1990/article/details/90767742
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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