★布局。
相對(duì)布局:
*偷炅浚靠父控件邊界(boolean) layout_alignParentTop(臀吖靠父控件上邊界); layout_alignParentRight 融师;layout_alignParentBottom右钾;layout_alignParentLeft
*) 相對(duì)父控件居中(boolean) layout_centerHorizontal;layout_centerVertical 旱爆; layout_centerInParent
*) 對(duì)齊周圍控件(指定ID) layout_alignTop 舀射;layout_alignRight ;layout_alignBottom ;layout_alignLeft ;layout_alignBaseLine
*) 拖傩耍靠周圍控件(指定id) layout_above笙僚;layout_below丰嘉;layout_toLeftOf; layout_toRightOf
線性布局:屬性:◆orientation(方向,水平horiaental(默認(rèn))、vertical(縱向))
◆高度layout_height(或?qū)挾萳ayout_width)和比重layout_weight(控件按比例分配剩余空間)二者選一拜鹤,設(shè)置weight(3),高度或?qū)挾仍O(shè)為0dp);
◆layout_gravity(重力引力):水平布局中只能設(shè)置上(top)流椒、中(center_vertial)敏簿、下(bottom);垂直布局:只能設(shè)置左(left)、中(center_horizental)、右(right);
表格布局:繼承自線性布局惯裕,縱向排列温数;stretchColumns(拉伸到合適的列下標(biāo)轻猖,傳入1帆吻,2或列下標(biāo)數(shù))
幀布局:控件疊加顯示(屬性:layout_gravity:top域那、right咙边、bottom、left次员、center败许、center_horizental、center_vertical)可兩兩組合使用屬性(共9種)淑蔚,用|連接(如:中下:bottom|center_horizental)[主要用于滑入的菜單框]
★layout_marginBottom:xxdp;上下偏移偏移量市殷,在程序中通過修改偏移量即可實(shí)現(xiàn)動(dòng)畫的效果;(包括marginTop刹衫、marginLeft醋寝、marginRight等)
網(wǎng)格布局:
◆columnCount:最大的列數(shù);
◆layput_column:指定控件在第幾列带迟;
◆:留白(用于某個(gè)控件不顯示音羞,用空白進(jìn)行填充);
◆layout_columnSpan:跨n列仓犬,但不拉伸嗅绰,需用layout_gravity=fill_horizontal拉伸;
◆rowSpan:跨n行搀继,用gravity=fill_vertical拉伸窘面;
★[通用屬性]
◆外邊距:margin(四邊一起設(shè)置)、marginTop叽躯、marginRight财边、marginBottom、marginLeft点骑;
◆內(nèi)邊距:padding(四邊一起設(shè)置)制圈、paddingTop、paddingRight畔况、paddingBottom鲸鹦、paddingLeft;
◆設(shè)置控件內(nèi)部重力引力(控制控件內(nèi)的內(nèi)容):gravity(區(qū)別于layout_geavity:設(shè)置當(dāng)前控件相對(duì)于父控件的重力引力(控制控件本身));
◆match_parent:匹配父容器大絮喂颉馋嗜;wrap_content:自適應(yīng)內(nèi)容;
◆背景:background;
◆是否為單行:boolean singLine吵瞻;
★Android res目錄:
是一個(gè)資源目葛菇,包括:
◆圖片; 布局資源眯停;? 文本、數(shù)組莺债、顏色資源;? 未編譯的資源齐邦;
◆values 用于文本國際化(I18N):不同國家地區(qū)的用戶〈肽矗可使用本地文字;
values-zh-rCN:中國大陸丐吓;valures-zh-rHK:中國香港;values-en-rUS:美國券犁;
◆資源訪問工具:Resource;獲得Resource實(shí)例:
getRessources();
getString(id);
getInteger(資源id);
★raw文件:原始格式的文件,不會(huì)被壓縮(編譯)族操;默認(rèn)沒有苛坚,須在res文件夾下創(chuàng)建。只能讀色难;對(duì)同一個(gè)資源若需國際化則放置在此文件夾中泼舱,并設(shè)定不同國家的文件夾。
手機(jī)中默認(rèn)編碼為UTF-8;
打開Raw文件輸入流枷莉,用Resource的getResource. openRawResource(id);返回一個(gè)InputStream;可用一個(gè)BufferedReader接收,但必須指定編碼娇昙,new BufferedReader(new InputStreamReader(in,”GBK”));
★assets目錄。資產(chǎn)
允許存放任意的文件笤妙、文件夾冒掌;但不會(huì)生成資源訪問id;提供了專門的方法來獲得文件輸入流劃列出文件列表蹲盘;只能讀出股毫,不能寫入;也不會(huì)被編譯召衔;
獲得資產(chǎn)訪問工具:String[]getAsset().list(path):獲得子目錄中的文件名稱列表铃诬;getAsset().open(文件路徑)、.open(文件、mode):獲得文件輸入流趣席;[mode為固定參數(shù):MODE_PRIVATE(默認(rèn)):私有兵志,只允許當(dāng)前應(yīng)用使用;……]
(此處assets即為相對(duì)根目錄宣肚,注意添加“/”問題)想罕。
先把Asset文件復(fù)制到SD卡,才可進(jìn)行更改和訪問霉涨;
★Appliaction
在應(yīng)用啟動(dòng)時(shí)按价,系統(tǒng)自動(dòng)創(chuàng)建Application實(shí)例,并調(diào)用它的onCreat()方法嵌纲。但系統(tǒng)默認(rèn)的Application的onCreat()方法沒有代碼俘枫;
可繼承Application,重寫onCreat()方法腥沽,在應(yīng)用啟動(dòng)時(shí)逮走,執(zhí)行自定義的一段代碼。(多用于連網(wǎng)今阳,初始化界面,拷貝數(shù)據(jù)等)
使用步驟:
繼承并重寫Application的onCreat方法
在清單中配置:在application中添加 name=”創(chuàng)建的類名”师溅;在應(yīng)用一啟動(dòng)就執(zhí)行。
進(jìn)程盾舌。在操作系統(tǒng)中墓臭,并行執(zhí)行的任務(wù)。
線程妖谴。在進(jìn)程內(nèi)部并行的任務(wù)窿锉。
java中創(chuàng)建線程的兩種方式:
●繼承Thread;啟動(dòng)后直接執(zhí)行內(nèi)部代碼嗡载;不可共享數(shù)據(jù)洼滚;
●實(shí)現(xiàn)Runnable接口遥巴;可放到其他線程中去執(zhí)享幽,new Thread(new runable).start()值桩。可共享數(shù)據(jù)斯入;
線程調(diào)度器刻两。負(fù)責(zé)在多個(gè)線程間切換執(zhí)行磅摹,為線程分配時(shí)間片;線程間競爭的關(guān)系饼灿;
線程狀態(tài)碍彭。new? runnable? running? block(阻塞態(tài)) dead(消亡態(tài)庇忌,不能再啟動(dòng))舰褪;
線程在.start()后進(jìn)入了runnable()后不一定就馬上執(zhí)行占拍,只是進(jìn)行了可運(yùn)行態(tài)。
線程作用:
§將大的任務(wù)表牢,切分為多個(gè)并行子任務(wù)初茶;
§阻塞的代碼要與其他代碼并行浊闪;
§間隔執(zhí)行的任務(wù)搁宾;
[sleep()和yield()是主動(dòng)暫停和讓出cpu盖腿,而interrupt()是被動(dòng)打斷损同、join()是被動(dòng)暫停去執(zhí)行另外調(diào)用此方法的線程膏燃。yield是讓步給優(yōu)先級(jí)相同的線程何什,若沒有相同或更高優(yōu)先級(jí)的線程則繼續(xù)執(zhí)行。]
◆推薦使用Runnable接口伶贰,還可繼承其他類黍衙。
◆線程優(yōu)先級(jí)越高荠诬,獲得執(zhí)行的機(jī)會(huì)就越多,但盡可能使用常量望迎。
多線程共享數(shù)據(jù)凌外。一個(gè)線程正在修改數(shù)據(jù)康辑,另一個(gè)線程同時(shí)訪問數(shù)據(jù)疮薇;
守護(hù)線程:
[守護(hù)線程即是將當(dāng)前線程作為后臺(tái)線程我注,一直執(zhí)行但骨,當(dāng)其他線程結(jié)束時(shí)可不關(guān)閉這個(gè)線程直接退出。]
使用守護(hù)線程的時(shí)機(jī):定時(shí)備份掠抬、計(jì)時(shí)器两波、GC-垃圾回收器;
.join()
在將一個(gè)計(jì)算分成若干個(gè)線程分別執(zhí)行時(shí)单起,必須為每個(gè)線程爭取到資源劣坊,故須加.join()方法,否則結(jié)果會(huì)不正確括儒。可放到線程池中去執(zhí)行帮寻。
t1.join():等待調(diào)用該方法的線程結(jié)束后再繼續(xù)執(zhí)行本線程赠摇;在多個(gè)相同線程同時(shí)啟動(dòng)時(shí)就對(duì)每個(gè)線程調(diào)用此方法藕帜,用于平均每個(gè)線程的cpu操作時(shí)間洽故,否則易出錯(cuò)时甚。
★synchronized標(biāo)記。同步標(biāo)識(shí)梨熙,可修飾方法咽扇、代碼塊陕壹,但不能修飾構(gòu)造器,屬性把敞;
讓一個(gè)代碼塊執(zhí)行完后再去執(zhí)行另外一個(gè)代碼塊奋早,過程為:加鎖-修改-釋放鎖。其作用是多線程共享數(shù)據(jù)時(shí)的數(shù)據(jù)安全耽装。有一個(gè)synchronized標(biāo)識(shí)就會(huì)創(chuàng)建一個(gè)監(jiān)視器掉奄。
◆將會(huì)產(chǎn)生爭奪的資源作為synchronized的鎖。
◆一個(gè)線程執(zhí)行到synchronized代碼塊時(shí)诞仓,必須先獲得得到同步鎖才能執(zhí)行墅拭;
◆如果得不到同步鎖谍婉,必須在synchronized代碼塊前等待镀钓;
◆非靜態(tài)的同步方法(同步方法的同步鎖為其本身this):獲得當(dāng)前對(duì)象的鎖丁溅;
◆靜態(tài)的同步方法:獲得“類對(duì)象”的鎖唧瘾;
◆同步的代碼塊:synchronized(對(duì)象){.同步代碼、集合.};
◆獲得指定對(duì)象的鎖:this求豫、類對(duì)象蝠嘉、存在訪問的數(shù)據(jù)對(duì)象杯巨、專門當(dāng)作鎖的對(duì)象服爷;
線程安全:StringBuffer、Vector舔涎、HashTable
線程不安全:StringBuilder逗爹、ArrayList掘而、HashMap
[線程安全是因?yàn)樗械姆椒恿藄ynchronized關(guān)鍵字;對(duì)線程不安全的類圃郊、方法可加上synchronized關(guān)鍵字即成線程安全持舆;但線程安全效率低伪窖,僅用于多線程時(shí)覆山。]
★生產(chǎn)者消費(fèi)者問題簇宽。
一種線程間通信
等待和通知機(jī)制。當(dāng)生產(chǎn)者生產(chǎn)過多譬嚣,若中間容器放滿時(shí)就讓生產(chǎn)者暫停等待一會(huì)兒拜银,在中間容器上添加:wait();否則中間容器還可放了時(shí)就通知生產(chǎn)者繼續(xù)生產(chǎn)尼桶,在中間容器上添加:notifyAll();消費(fèi)者類似泵督。
◆wait()外面總是一個(gè)循環(huán)判斷 小腊,以對(duì)并發(fā)下的訪問處理;
在等待wait()蜒简、通知notify()外面搓茬,必須有一個(gè)synchronized以創(chuàng)建一個(gè)監(jiān)視器卷仑,在監(jiān)視器中才可等待和通知锡凝。在執(zhí)行wait()等待時(shí)會(huì)釋放鎖。
★線程本地共享ThreadLocal(綁定):在當(dāng)前線程上锚扎,可以綁定一個(gè)數(shù)據(jù)馁启,
當(dāng)執(zhí)行到后面組件代碼時(shí)驾孔,可從當(dāng)前線程獲得數(shù)據(jù)
方法:
◆set(數(shù)據(jù)) ? 在當(dāng)前線程綁定數(shù)據(jù)
◆get() ????? 從當(dāng)前線程獲取數(shù)據(jù)
◆remove()??? 從當(dāng)前線程移除數(shù)據(jù)
線程工具類。
Timer / TimerTask:計(jì)時(shí)任務(wù)惯疙,用來執(zhí)行定時(shí)任務(wù)翠勉,或間隔任務(wù)。
timer.schedule(new TimeTask(){..},..)
★線程池霉颠。典型使用:
ExecutorService pool = Executors.newCachedThreadPool();//創(chuàng)建一個(gè)線程池
for?(inti?=?0;?i?<?10000;?i++)?{
pool.execute(new?runnable(i));??//把任務(wù)放入線程池对碌,自動(dòng)執(zhí)行。
}
ExecutorService?pool?=?Executors.newFixedThreadPool(3);//放入三個(gè)線程
●在異步任務(wù)中也提供了線程池:
Executor pool = AsyncTask.SERIAL_EXECUTOR;? //不定線程數(shù)
Executor pool= AsyncTask.THREAD_POOL_EXECUTOR;? //包含5個(gè)線程掉分;足夠俭缓;
Android都是單線程模型。所有的界面顯示酥郭、用戶操作、組件控制,必須在主線程執(zhí)行。
◆若在主界面中處理大量運(yùn)算超時(shí)后會(huì)出現(xiàn)ANR乏矾。
[ANR :Application Not Responding 應(yīng)用無響應(yīng)。主線程執(zhí)行時(shí),程序阻塞在一段代碼中说墨。主線程無法更新界面顯示,也無法響應(yīng)用戶的其他操作;用戶在界面點(diǎn)擊后5秒后無響應(yīng)就也彈出ANR;]
Android線程通信船惨。如須在工作線程中要更新界面顯示怜浅,要向主線程發(fā)送消息自点。自己定義的工作線程不能更新UI界面,只有在主線程中才能更新。