Android多執行緒機制解析

2021-07-02 14:41:45 字數 1661 閱讀 8348

為何要使用多執行緒?

執行緒安全、經典的賣票問題

執行緒耗時、耗時的操作不能在主線程中執行

耗時的操作

anr,比如io操作,也就是網路操作,檔案操作,資料庫操作等等

如何與主線程互動

可以使用runonuithread,handler,asynctask

handler解析:

handler機制包含messagequeue,looper

在hnalder在sendmessage()後,message將會被放到訊息佇列messagequeue中,訊息佇列是先進先出原則,而looper會從messagequeue中取出訊息,傳送給handler進行解決。

這個過程可以比喻為我去面試的時候,快輪到我(handler),我想跟面試官(looper)說我去上個廁所,但是我沒辦法直接跟面試官講,我就告訴工作人員(messagequeue),工作人員就將我的訊息message告訴looper,然後looper告訴我可以去上廁所,然後我就去解決這個問題(handler處理從messagequeue中取出的事件)。

asynctask

asynctask,是android提供的輕量級的非同步類,可以直接繼承asynctask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以通過介面實現ui進度更新),最後反饋執行的結果給ui主線程.

asynctask定義了三種泛型型別 params,progress和result。

params 啟動任務執行的輸入引數,比如http請求的url。

progress 後台任務執行的百分比。

result 後台執行任務最終返回的結果,比如string。

使用過asynctask 的同學都知道乙個非同步載入資料最少要重寫以下這兩個方法:

doinbackground(params…) 後台執行,比較耗時的操作都可以放在這裡。注意這裡不能直接操作ui。此方法在後台執行緒執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以呼叫publicprogress(progress…)來更新任務的進度。

onpostexecute(result) 相當於handler 處理ui的方式,在這裡面可以使用在doinbackground 得到的結果處理操作ui。 此方法在主線程執行,任務執行的結果作為此方法的引數返回

有必要的話你還得重寫以下這三個方法,但不是必須的:

onprogressupdate(progress…) 可以使用進度條增加使用者體驗度。 此方法在主線程執行,用於顯示任務執行的進度。

onpreexecute() 這裡是終端使用者呼叫excute時的介面,當任務執行之前開始呼叫此方法,可以在這裡顯示進度對話方塊。

oncancelled() 使用者呼叫取消時,要做的操作

使用asynctask類,以下是幾條必須遵守的準則:

task的例項必須在ui thread中建立;

execute方法必須在ui thread中呼叫;

不要手動的呼叫onpreexecute(), onpostexecute(result),doinbackground(params…), onprogressupdate(progress…)這幾個方法;

該task只能被執行一次,否則多次呼叫時將會出現異常;

Android 多執行緒

1 簡介 2 android 平台下的多執行緒 package com.powerise.thread import android.os.bundle import android.view.view import android.view.view.onclicklistener import ...

Android 多執行緒

1,常用的thread 和running的方法 public static void thread thread.start private static void running thread thread new thread runnable thread.start private stat...

Android 多執行緒

最近開始做安卓專案,然而對多執行緒的理解和應用還是欠缺,最近就系統的學習一下 public class testthreadactivity extends baseactivity private void initviews private class mytask extends asynct...