Android 面試題:Handler、自定義View袋狞、Java三大特性焚辅、分發(fā)機(jī)制、動(dòng)畫(huà)

前言

  • 一年之計(jì)在于春 金三銀四已經(jīng)要到來(lái)苟鸯,2019的新的開(kāi)始同蜻,作為一個(gè)開(kāi)發(fā)人員,你是否面上了自己理想的公司早处,薪資達(dá)到心中理想的高度湾蔓?

  • 如果沒(méi)有的話, 你就需要掌握更加成熟的技術(shù)砌梆,也需要更多的知識(shí)儲(chǔ)備卵蛉,對(duì)于我們上班族而言,工作的好壞就變得格外重要么库,想要拿高的工資傻丝,就好好的做好面試準(zhǔn)備,

  • 以下是我為大家精心挑選的面試題诉儒,話不多說(shuō)葡缰,看東西。

正文

如何正確使用Handler忱反?

Handler的工作是依賴于Looper的泛释,而Looper(與消息隊(duì)列)又是屬于某一個(gè)線程(ThreadLocal是線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類,通過(guò)它可以在指定線程中存儲(chǔ)數(shù)據(jù)温算,其他線程則無(wú)法獲取到)怜校,其他線程不能訪問(wèn)。因此Handler就是間接跟線程是綁定在一起了注竿。因此要使用Handler必須要保證Handler所創(chuàng)建的線程中有Looper對(duì)象并且啟動(dòng)循環(huán)茄茁。因?yàn)樽泳€程中默認(rèn)是沒(méi)有Looper的,所以會(huì)報(bào)錯(cuò)巩割。正確的使用方法是:


        private Handler mHandler;

        public Handler getHandler() {
            return mHandler;
        }
          public void quit() {
            mHandler.getLooper().quit();
        }
        @Override
        public void run() {
            super.run();
            //創(chuàng)建該線程對(duì)應(yīng)的Looper,
            // 內(nèi)部實(shí)現(xiàn)
            // 1裙顽。new Looper()
            // 2。將1步中的lopper 放在ThreadLocal里宣谈,ThreadLocal是保存數(shù)據(jù)的愈犹,主要應(yīng)用場(chǎng)景是:線程間數(shù)據(jù)互不影響的情況
            // 3。在1步中的Looper的構(gòu)造函數(shù)中new MessageQueue();
            //其實(shí)就是創(chuàng)建了該線程對(duì)用的Looper闻丑,Looper里創(chuàng)建MessageQueue來(lái)實(shí)現(xiàn)消息機(jī)制
            //對(duì)消息機(jī)制不懂得同學(xué)可以查閱資料漩怎,網(wǎng)上很多也講的很不錯(cuò)勋颖。
            Looper.prepare();
            mHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what);
                }
            };
            //開(kāi)啟消息的死循環(huán)處理即:dispatchMessage
            Looper.loop();
            //注意這3個(gè)的順序不能顛倒
            Log.d("WorkThread", "end");
        }
    }

自定義控件優(yōu)化方案

為了加速你的view,對(duì)于頻繁調(diào)用的方法勋锤,需要盡量減少不必要的代碼饭玲。先從onDraw開(kāi)始,需要特別注意不應(yīng)該在這里做內(nèi)存分配的事情怪得,因?yàn)樗鼤?huì)導(dǎo)致GC咱枉,從而導(dǎo)致卡頓。在初始化或者動(dòng)畫(huà)間隙期間做分配內(nèi)存的動(dòng)作徒恋。不要在動(dòng)畫(huà)正在執(zhí)行的時(shí)候做內(nèi)存分配的事情蚕断。

你還需要盡可能的減少onDraw被調(diào)用的次數(shù),大多數(shù)時(shí)候?qū)е耾nDraw都是因?yàn)檎{(diào)用了invalidate().因此請(qǐng)盡量減少調(diào)用invaildate()的次數(shù)入挣。如果可能的話亿乳,盡量調(diào)用含有4個(gè)參數(shù)的invalidate()方法而不是沒(méi)有參數(shù)的invalidate()。沒(méi)有參數(shù)的invalidate會(huì)強(qiáng)制重繪整個(gè)view径筏。

另外一個(gè)非常耗時(shí)的操作是請(qǐng)求layout葛假。任何時(shí)候執(zhí)行requestLayout(),會(huì)使得Android UI系統(tǒng)去遍歷整個(gè)View的層級(jí)來(lái)計(jì)算出每一個(gè)view的大小滋恬。如果找到有沖突的值聊训,它會(huì)需要重新計(jì)算好幾次。另外需要盡量保持View的層級(jí)是扁平化的恢氯,這樣對(duì)提高效率很有幫助带斑。如果你有一個(gè)復(fù)雜的UI,你應(yīng)該考慮寫(xiě)一個(gè)自定義的ViewGroup來(lái)執(zhí)行他的layout操作勋拟。與內(nèi)置的view不同勋磕,自定義的view可以使得程序僅僅測(cè)量這一部分,這避免了遍歷整個(gè)view的層級(jí)結(jié)構(gòu)來(lái)計(jì)算大小敢靡。這個(gè)PieChart 例子展示了如何繼承ViewGroup作為自定義view的一部分挂滓。PieChart 有子views,但是它從來(lái)不測(cè)量它們啸胧。而是根據(jù)他自身的layout法則赶站,直接設(shè)置它們的大小。

談?wù)勀銓?duì)Java三大特性的理解

封裝

封裝最好理解了吓揪。封裝是面向?qū)ο蟮奶卣髦磺椎。菍?duì)象和類概念的主要特性。
封裝柠辞,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作主胧,對(duì)不可信的進(jìn)行信息隱藏叭首。

繼承

面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”习勤。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展焙格。
通過(guò)繼承創(chuàng)建的新類稱為“子類”或“派生類”图毕。
被繼承的類稱為“基類”、“父類”或“超類”眷唉。
繼承的過(guò)程予颤,就是從一般到特殊的過(guò)程。

多態(tài)

多態(tài)性(polymorphisn)是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù)冬阳,賦值之后蛤虐,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō)肝陪,就是一句話:允許將子類類型的指針賦值給父類類型的指針驳庭。
實(shí)現(xiàn)多態(tài),有二種方式氯窍,覆蓋饲常,重載。
覆蓋狼讨,是指子類重新定義父類的虛函數(shù)的做法贝淤。
重載,是指允許存在多個(gè)同名函數(shù)政供,而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同播聪,或許參數(shù)類型不同,或許兩者都不同)鲫骗。

談?wù)凙ndroid的事件分發(fā)機(jī)制

事件的傳遞流程:

Activity(PhoneWindow)->DecorView->ViewGroup->View犬耻。

事件分發(fā)過(guò)程中三個(gè)重要的方法:

dispatchTouchEvent()、onInterceptTouchEvent()执泰、onTouchEvent()枕磁;

事件傳遞規(guī)則

一般一次點(diǎn)擊會(huì)有一系列的MotionEvent,可以簡(jiǎn)單分為:down->move->….->move->up,當(dāng)一次event分發(fā)到ViewGroup時(shí)术吝,ViewGroup收到事件后調(diào)用dispatchTouchEvent计济,在dispatchTouchEvent中先檢查是否要攔截,若攔截則ViewGroup處理事件排苍,否則交給有處理能力的子容器處理沦寂。

Android動(dòng)畫(huà)有幾種,對(duì)其理解
  • 視圖動(dòng)畫(huà)淘衙。視圖移動(dòng)传藏、view真真的位置并未移動(dòng)。
  • 幀動(dòng)畫(huà)。就和放電影一樣毯侦,一幀一幀的播
  • 屬性動(dòng)畫(huà)哭靖。視圖移動(dòng)、其位置也會(huì)隨著移動(dòng)侈离。
  • 觸摸返回動(dòng)畫(huà)试幽。發(fā)生觸摸事件時(shí)有反饋效果。比如波紋效果
  • 揭露動(dòng)畫(huà)卦碾。從某一個(gè)點(diǎn)向四周展開(kāi)或者從四周向某一點(diǎn)聚合起來(lái)铺坞。
  • 轉(zhuǎn)場(chǎng)動(dòng)畫(huà) & 共享元素。比如切換activity洲胖。共享元素一般我們使用在轉(zhuǎn)換的前后兩個(gè)頁(yè)面有共同元素時(shí)济榨。
  • 視圖狀態(tài)動(dòng)畫(huà)。就是 View 在狀態(tài)改變時(shí)執(zhí)行的動(dòng)畫(huà)效果
  • 矢量圖動(dòng)畫(huà)宾濒。在圖片的基礎(chǔ)上做動(dòng)畫(huà)腿短。
  • 約束布局實(shí)現(xiàn)的關(guān)鍵幀動(dòng)畫(huà)。就是給需要?jiǎng)赢?huà)效果的屬性绘梦,準(zhǔn)備一組與時(shí)間相關(guān)的值橘忱。關(guān)鍵的幾個(gè)值。

最后

希望大家能有一個(gè)好心態(tài)卸奉,想進(jìn)什么樣的公司要想清楚钝诚,并不一定是大公司,我選的也不是特大廠榄棵。當(dāng)然如果你不知道選或是沒(méi)有規(guī)劃凝颇,那就選大公司!
希望我們能先選好想去的公司再投或內(nèi)推疹鳄,而不是有一個(gè)公司要我我就去拧略!還有就是不要害怕,也不要有壓力瘪弓,平常心對(duì)待就行垫蛆,但準(zhǔn)備要充足。最后希望大家都能拿到一份滿意的 offer 腺怯!如果目前有一份工作也請(qǐng)好好珍惜好好努力袱饭,找工作其實(shí)挺累挺辛苦的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呛占,一起剝皮案震驚了整個(gè)濱河市虑乖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晾虑,老刑警劉巖疹味,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仅叫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佛猛,警方通過(guò)查閱死者的電腦和手機(jī)惑芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人郭赐,你說(shuō)我怎么就攤上這事兄猩。” “怎么了糙臼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我边臼,道長(zhǎng),這世上最難降的妖魔是什么假消? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任柠并,我火速辦了婚禮,結(jié)果婚禮上富拗,老公的妹妹穿的比我還像新娘臼予。我一直安慰自己,他們只是感情好啃沪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布粘拾。 她就那樣靜靜地躺著,像睡著了一般创千。 火紅的嫁衣襯著肌膚如雪缰雇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天追驴,我揣著相機(jī)與錄音械哟,去河邊找鬼。 笑死殿雪,一個(gè)胖子當(dāng)著我的面吹牛暇咆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冠摄,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糯崎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了河泳?” 一聲冷哼從身側(cè)響起沃呢,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拆挥,沒(méi)想到半個(gè)月后薄霜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體某抓,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年惰瓜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了否副。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崎坊,死狀恐怖备禀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奈揍,我是刑警寧澤曲尸,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站男翰,受9級(jí)特大地震影響另患,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛾绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一昆箕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧租冠,春花似錦鹏倘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至话原,卻和暖如春夕吻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背繁仁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工涉馅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黄虱。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓稚矿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捻浦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晤揣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • java 接口的意義-百度 規(guī)范、擴(kuò)展朱灿、回調(diào) 抽象類的意義-樂(lè)視 為其子類提供一個(gè)公共的類型封裝子類中得重復(fù)內(nèi)容定...
    交流電1582閱讀 2,228評(píng)論 0 11
  • 1昧识,java 接口的意義: 規(guī)范,擴(kuò)展盗扒,回調(diào) 規(guī)范:比如跪楞,有兩個(gè)及上的的類擁有相同的方法缀去,但是實(shí)現(xiàn)功能不一樣,就可...
    漫唐閱讀 968評(píng)論 0 6
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • 一甸祭、簡(jiǎn)歷準(zhǔn)備 1缕碎、個(gè)人技能 (1)自定義控件、UI設(shè)計(jì)池户、常用動(dòng)畫(huà)特效 自定義控件 ①為什么要自定義控件咏雌? Andr...
    lucas777閱讀 5,202評(píng)論 2 54
  • 前幾天整理了Java面試題集合,今天再來(lái)整理下Android相關(guān)的面試題集合.如果你希望能得到最新的消息,可以關(guān)注...
    Boyko閱讀 3,632評(píng)論 8 135