理解Android UI與執行緒互動

2021-08-26 10:41:37 字數 1388 閱讀 7583

起初,上面的**似乎是乙個很好的解決方案,因為它不會鎖住使用者介面執行緒。然面不幸的是,它違反了使用者介面單執行緒模型:android的使用者介面工具包不是執行緒安全的,只能在ui執行緒中操作它,在上面的**中,你在乙個工作執行緒中呼叫mimageview.setimagebitmap(b)時,將會發生意想不到的錯誤,這種錯誤是非常難跟蹤和除錯的。

android提供了幾種方法來從其他執行緒訪問ui執行緒。您可能已經熟悉他們了,下面是乙個較全面的列表:

activity.runonuithread(runnable)

view.post(runnable)

view.postdelayed(runnable,long)

handler

您可以使用這些類和方法中的任何一種糾正前面的**示例:

public void onclick(view v)

});}

}).start();

}不幸的是,這些類和方法也往往使你的**更複雜,更難以閱讀。更糟糕的是,它需要頻繁執行複雜的操作介面更新。

為了解決這個問題,1.5和更高版本的android平台提供了乙個實用類稱為asynctask,簡化了長時間執行的任務,需要與使用者介面的互動。

類似asynctask的乙個類usertask也可用於android1.0和1.1版本,它提供了完全相同的api,所有您需要做的是把它的源**複製到你的應用程式中。

asynctask的目標是要為你的執行緒提供管理服務,我們前面的例子可以很容易的用asynctask來改寫:

public void onclick(view v)

protected void onpostexecute(bitmap result)

}正如你所看到的,我們必須通過繼承asynctask類來使用它,非常重要的一點是:asynctask必須在ui執行緒中例項化它,並且只能執行一次。

以下是asynctask的簡要使用方法:

•您可以指定三個引數型別,泛型引數,進度值(執行過程中返回的值)和最終值(執行完返回的值)。

•該方法doinbackground()自動執行工作執行緒(後台執行緒)

•onpreexecute(),onpostexecute()和onprogressupdate()都是在ui執行緒呼叫

•由doinbackground返回的值()傳送到onpostexecute()

•您可以在執行doinbackground()時呼叫publishprogress()然後在ui組程中執行onprogressupdate()。

•您可以從任何執行緒隨時取消任務

不管你是否使用asynctask,時刻牢記單一執行緒模型的兩條規則:

1、不要鎖住使用者介面。

2、確保只在ui執行緒中訪問android使用者介面工具包中的元件。

asynctask只是可以讓你更容易地做這些事情。

Android UI主線程與子執行緒

乙個android 程式預設情況只有乙個程序,但是乙個程序可以有多個執行緒。其中有乙個ui 執行緒也稱為ui主線程,ui thread在android程式執行的時候就被建立,主要是負責控制ui介面的顯示 更新和控制項互動。所有的android應用程式元件 包括activity service bro...

C winform中UI執行緒與工作執行緒的互動

c winform中ui執行緒與工作執行緒的互動 1.使用多執行緒 void calcpi int digits void calcbutton click object sender,eventargs e void calcpithreadstart object digits 2.在ui執行緒...

程序與執行緒理解

程序和執行緒簡單而基本靠譜的定義如下 程序 程式 在資料集上的一次執行,資源分配的基本單位 執行緒 程式的一部分 塊,某個模組 在資料集上的一次執行,cpu的基本排程單位 一些例子概念理解 cpu ram 各種資源 比如顯示卡,光碟機,鍵盤,gps,等等外設 構成我們的電腦,但是電腦的執行,實際就是...