Android學(xué)習(xí)筆記(一)

★布局。

相對(duì)布局

*??扛缚丶吔纾╞oolean) 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

*) ??恐車丶ㄖ付╥d) 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:匹配父容器大?。粀rap_content:自適應(yīng)內(nèi)容;

◆背景:background;

◆是否為單行:boolean singLine;


Android res目錄

是一個(gè)資源目,包括:

◆圖片; 布局資源;? 文本、數(shù)組、顏色資源;? 未編譯的資源;

◆values 用于文本國際化(I18N):不同國家地區(qū)的用戶??墒褂帽镜匚淖郑?/p>

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界面,只有在主線程中才能更新。


原文地址:Android學(xué)習(xí)筆記(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容