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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!