起初,上面的**似乎是乙個很好的解決方案,因為它不會鎖住使用者介面執行緒。然面不幸的是,它違反了使用者介面單執行緒模型: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,等等外設 構成我們的電腦,但是電腦的執行,實際就是...