程序和執行緒

2022-09-06 09:24:07 字數 1702 閱讀 4480

標籤(空格分隔): android api指導

此文件介紹android應用的程序和執行緒是如何工作的。

預設的,同乙個應用中的所有元件都是執行在同乙個程序。

所有元件在manifest檔案中可以通過android:process屬性來指定執行的程序。

android系統會給每個程序分級,如果系統需要**記憶體時,就先銷毀優先順序低的程序,各層級如下(序號越高,重要性越低,越容易被銷毀):

前台程序

使用者正在使用的,有如下場景:

一般來說,某個時間點上只有少數的前台程序在執行。他們只有在記憶體低到無法繼續執行的時候才有可能會被銷毀。

3. 可視程序

程序不包含前台元件,但仍是使用者可見的,有如下場景:

服務程序

由startservice啟動的服務,並且不在1和2場景中。

後台程序

承載不可見的activity(onstop已經執行)

空程序不承載任何元件的程序

android ui是單執行緒模型,應用中所有元件的例項都在同乙個ui執行緒中執行,當ui執行緒阻塞時,會無法分發使用者的點選事件導致anr。

另外,ui執行緒是非執行緒安全的,所有與使用者介面相關的互動必須都放在ui執行緒中,而不是用其他工作執行緒,因此,對於android執行緒模型來說有兩條簡單的規則:

不要阻塞ui執行緒

不要在ui執行緒之外的其他執行緒中訪問ui元素

public void onclick(view v) 

}).start();

}

但是上述**又違反了第二條規則,在非ui執行緒中使用了介面元素mimageview。

為了避免這個問題,android提供了如下方法:

例如,可以這麼用:

public void onclick(view v) 

});}

}).start();

}

然而對於複雜的操作,上述**很難維護,你可以使用handler來處理,也可以擴充套件asynctask類

使用asynctask

asynctask允許執行ui元素的非同步操作,它會在工作執行緒中執行阻塞ui的操作,然後將結果傳送給ui執行緒,而不需要你自己處理執行緒。

使用方法:繼承asynctask,實現在後台執行緒池執行的doinbackground,實現onpostexecute來更新ui。

例子:

public void onclick(view v) 

private class downloadimagetask extends asynctask

/** 系統呼叫這個重新整理ui介面,其中result是doinbackground()的返回值 */

protected void onpostexecute(bitmap result)

}

asynctask用之前,建議看一下sdk文件

執行時的配置變化(比如橫豎屏)會銷毀你的工作執行緒,可以檢視shelves例子**。

某些情況下,你寫的方法可能被多個執行緒呼叫,那就需要這個方法是執行緒安全的。

像service的onbind,contentprovider的query、insert、delete、update、gettype都是類似需要執行緒安全的函式。

ipc,rpc,詳見service章節

執行緒和程序

標準的定義是 程序是執行緒的容器,乙個程序可於乙個或者多個執行緒,它是系統分配資源的基本單位 同乙個程序下,執行緒共享位址空降 已經開啟的檔案 訊號處理函式 報警訊號和其他,執行緒自己只保留程式計數器和棧。但是很遺憾的,這個只是教科書上的定義,實際情況是每個作業系統實現的作業系統特性不同,實現的方法...

程序和執行緒

乙個程序就是當前正在執行的乙個程式,包括程式的暫存器 程式計數器和變數的當前值。不同的程序擁有不同的位址空間。而執行緒可以理解為是程序中的控制流。同乙個程序內也就是說在同乙個位址空間內可以有多個控制流。也就是可以有多個線 程,他們共享位址空間。我們通常將程序視為是資源的集合,程序中有程式的正文 資料...

執行緒和程序

對於求職者,在面試的時候大多都會被問到 你對多執行緒了解麼?給我講講執行緒和程序的區別吧。在unix中,乙個程序可以理解為執行緒 位址空間 檔案描述符 資料,道破現實,其實就相當於老闆和員工,老闆就是程序,員工就是執行緒。老闆需要僱傭若干員工 執行緒 還要有辦公樓 位址空間 還要有若干的辦公裝置 檔...