主要有三種方法,一爲Handler,二爲AsyncTask,三爲本身開子線程執行耗時操做,而後調用Activity的runOnUiThread()方法更新ui;html
handler機制是,在主線程中建立handler對象,java
當執行耗時操做時,新建一個線程,在這個線程中執行耗時操做,經過調用handler的sendMessage,post等方法,更新ui界面;android
AsyncTask本質上是一個線程池,全部的異步任務都會在這個線程池中的工做線程中執行,當須要操做ui界面時,會和工做線程經過handler傳遞消息。數據庫
本身開子線程執行耗時操做,而後調用Activity的runOnUiThread()方法更新ui,這種方法須要把context對象強制轉換成activity後使用安全
handler機制的優勢是 結構清晰,功能明確,可是代碼過多;網絡
asyncTask簡單,快捷,可是可能會新開大量線程,消耗系統資源,形成FC多線程
第三種方法最好用,代碼也很是簡單,只是須要傳遞context對象併發
4.廣播機制:經過系統廣播或者自定義的廣播去異步
實現UI線程與耗時操做線程之間的通訊 async
優勢:實現簡單
缺點:不利於調試,且消息傳遞不夠靈活,會存在安全問題
5 EventBus:EventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與後臺線程間的通訊。
好比請求網絡,等網絡返回時經過Handler或Broadcast通知UI,兩個Fragment之間須要經過Listener通訊,這些需求均可以經過EventBus實現
優勢:針對一個進程,解耦
缺點:大量使用會不利於調式
intent能夠傳遞8種基本數據類型和2個實現序列化和parcelable接口的2個對象.實現序列化的對象存放在本地文件,實現
parcelable的對象存放在內存中.
Serializable :將 Java 對象序列化爲二進制文件的 Java 序列化技術是 Java系列技術中一個較爲重要的技術點,在大部分狀況下,開發人員只須要了解被序列化的類須要實現 Serializable 接口,使用ObjectInputStream 和 ObjectOutputStream 進行對象的讀寫。
charsequence :
在JDK1.4中,引入了CharSequence接口,實現了這個接口的類有:CharBuffer、String、StringBuffer、StringBuilder這個四個類。
CharBuffer爲nio裏面用的一個類,String實現這個接口理所固然,StringBuffer也是一個 CharSequence,StringBuilder是Java抄襲C#的一個類,基本和StringBuffer類同樣,效率高,可是不保證線程安 全,在不須要多線程的環境下能夠考慮。
提供這麼一個接口,有些處理String或者StringBuffer的類就不用重載了。可是這個接口提供的方法有限,只有下面幾個:charat、length、subSequence、toString這幾個方法,感受若是有必要,仍是重載的比較好,避免用instaneof這個操做符。
Parcelable :
android提供了一種新的類型:Parcel。本類被用做封裝數據的容器,封裝後的數據能夠經過Intent或IPC傳遞。 除了基本類型以
外,只有實現了Parcelable接口的類才能被放入Parcel中。
是GOOGLE在安卓中實現的另外一種序列化,功能和Serializable類似,主要是序列化的方式不一樣
Bundle:Bundle是將數據傳遞到另外一個上下文中或保存或回覆你本身狀態的數據存儲方式。它的數據不是持久化狀態。
(1)選項菜單Options menus :一個Activity只能有一個選項菜單,在按下Menu鍵時,顯示在屏幕下方。
(2)上下文菜單Context menus :爲Activity中的任何一個視圖註冊一個上下文菜單,「長按」出現。
(3)彈出式菜單Popup menus :依賴於Activity中的某個一個視圖。
重寫 onCreateContextMenu 用以建立上下文菜單重寫 onContextItemSelected 用以響應上下文菜單 重寫 onCreateOptionsMenu 用以建立選項菜單重寫 onOptionsItemSelected 用以響應選項菜單
1.管理一個平面, 這個平面是一個特殊的內存塊 , 它能夠和 android 視圖系統混合 .
2.管理一個EGL 顯示 , 它可以讓 OpenGL 渲染到一個平面 .
3.接受一個用戶提供的實際顯示的Renderer 對象 .
4.使用一個專用線程去渲染從而和UI 線程解耦 .
5.支持on-demand 和連續的渲染.
6.可選的包, 追蹤 和 / 或者錯誤檢查這個渲染器的 OpenGL 調用 .
一、線程間通訊機制
首先,looper、handler、messagequeue三者共同實現了android系統裏線程間通訊機制。如在A、B兩個子線程之間須要傳遞消 息,首先給每一個子線程綁定一套handler、looper、messagequeue機制,而後這三個對象都與其所屬線程對應。而後A線程經過調用B線 程的Handler對象,發送消息。這個消息會被Handler發送到B線程的messagequeue中,而屬於B線程的Looper對象一直在for 循環裏無限遍歷MessageQueue, 一旦發現該消息隊列裏收到了新的消息,就會去對消息進行處理,處理過程當中會回調自身Handler的heandleMessage方法。從而實現了不一樣線 程間通訊。
二、Looper實現原理
Looper類裏包含一個消息隊列對象和一個線程對象。當建立Looper時,會自動建立一個消息隊列,同時將內部線程對象指向建立Looper的線程。 當開啓Looper後(looper.loop()),會自動進入無限for循環中,不斷去遍歷消息隊列,若是沒有消息則阻塞,有消息則回調 handler的handlemessage方法進行處理。
三、Looper.prepare()
首先,要使用Looper機制通常會在當前線程中建立Handler對象,裏面會自動建立一個looper對象和消息隊列,這裏面的消息隊列屬於當前線程 空間。但此時的looper還不會去遍歷,也沒有綁定到當前線程。其中,looper對象內部也包含一個空消息隊列對象和空線程。經過 Looper.prepare()方法,先讓該消息隊列指向當前線程的消息隊列,讓空線程也指向當前線程。從而實現了綁定。
A.Message提供了消息池,有靜態方法Obtain從消息池中取對象;
B.Thread默認不提供資源池,除非使用線程池ThreadPool管理;
C.AsynTask是線程池改造的,池裏 默認提供(核數+1)個線程進行併發操做,最大支持(核數 * 2 + 1)個線程,超事後會丟棄其餘任務;
D.Looper,每一個Looper建立時建立一個消息隊列和線程對象,也不是資源池;
所以答案爲AC
恢復地址簿
修復丟失的文字信息
恢復刪除的信息
恢復備份設置和數據來從新安裝程序
standard、singleTop、singleTask、singleInstance
「拿來主義」standard模式。哪裏須要調用我我就去哪裏,能夠屢次實例化,能夠幾個相同的Activity重疊。
「拒絕堆疊」singleTop模式。能夠屢次實例化,可是不能夠多個相同的Activity重疊,當堆棧的頂部爲相同的Activity時,會調用onNewIntent函數。
「獨立門戶」singleTask模式。同一個應用中調用該Activity時,若是該Activity沒有被實例化,會在 本應用程序的Task內實例 化,若是已經實例化,會將Task中其上的Activity銷燬後,調用onNewIntent;其它應用程序調用該Activity時,若是該 Activity沒有被實例化,會建立新的Task並實例化後入棧,若是已經實例化,會銷燬其上的Activity,並調用onNewIntent。一句 話,singleTask就是「獨立門戶」,在本身的Task裏,而且啓動時不容許其餘Activity凌駕於本身之上。
「孤獨寂寞」singleInstance模式。加載該Activity時若是沒有實例化,他會建立新的Task後,實例化入棧,若是已經存在,直接調用 onNewIntent,該Activity的Task中不容許啓動其它的Activity,任何從該Activity啓動的其餘Activity都將被 放到其餘task中,先檢查是否有本應用的task,沒有的話就建立。
15 對文件名爲Test.java的java代碼描述正確的是()
class
Person {
String name =
"No name"
;
public
Person(String nm) {
name = nm;
}
}
class
Employee extends Person {
String empID =
"0000"
;
public
Employee(String id) {
empID = id;
}
}
public
class
Test {
public
static
void
main(String args[]) {
Employee e =
new
Employee(
"123"
);
System.out.println(e.empID);
}
}
輸出:0000
輸出:123
編譯報錯
輸出:No name