Activity面試詳情
activity生命周期
1.activity的4種狀態(tài)
running/paused/stopped/killed
2.activity的生命周期
activity啟動(dòng)->onCreate()->onStart()->onResume()
點(diǎn)擊home鍵回到主界面(activity不可見(jiàn))->onPause()->stop()
當(dāng)我們?cè)俅位氐皆璦ctivity時(shí)->onRestart()->onStart()->onResume()
退出當(dāng)前activity時(shí)->onPause()->onStop()->onDestroy()
3.android進(jìn)程優(yōu)先級(jí)
前臺(tái)/可見(jiàn)/服務(wù)/后臺(tái)/空
二.android任務(wù)棧
三.activity啟動(dòng)模式
啟動(dòng)模式可在AndroidManifest.xml中俏竞,通過(guò)標(biāo)簽的android:launchMode屬性設(shè)置长捧。
1.standard模式
? ? a.Activity的默認(rèn)啟動(dòng)模式
? ? b.每啟動(dòng)一個(gè)Activity就會(huì)在棧頂創(chuàng)建一個(gè)新的實(shí)例。例如:鬧鐘程序
?? ?缺點(diǎn):當(dāng)Activity已經(jīng)位于棧頂時(shí)叔收,而再次啟動(dòng)Activity時(shí)還需要在創(chuàng)建一個(gè)新的實(shí)例撤奸,不能直接復(fù)用吠昭。
2.singleTop模式
?? ?特點(diǎn):該模式會(huì)判斷要啟動(dòng)的Activity實(shí)例是否位于棧頂,如果位于棧頂直接復(fù)用胧瓜,否則創(chuàng)建新的實(shí)例矢棚。 例如:瀏覽器的書簽
?? ?缺點(diǎn):如果Activity并未處于棧頂位置,則可能還會(huì)創(chuàng)建多個(gè)實(shí)例府喳。
3.singleTask模式
?? ?特點(diǎn):使Activity在整個(gè)應(yīng)用程序中只有一個(gè)實(shí)例。每次啟動(dòng)Activity時(shí)系統(tǒng)首先檢查棧中是否存在當(dāng)前Activity實(shí)例兜粘,如果存在
?? ??? ? ? ?? 則直接復(fù)用弯蚜,并把當(dāng)前Activity之上所有實(shí)例全部出棧孔轴。例如:瀏覽器主界面
4.singleInstance模式
?? ?特點(diǎn):該模式的Activity會(huì)啟動(dòng)一個(gè)新的任務(wù)棧來(lái)管理Activity實(shí)例,并且該勢(shì)力在整個(gè)系統(tǒng)中只有一個(gè)熟吏。無(wú)論從那個(gè)任務(wù)棧中??? 啟動(dòng)該Activity,都會(huì)是該Activity所在的任務(wù)棧轉(zhuǎn)移到前臺(tái)悍引,從而使Activity顯示帽氓。主要作用是為了在不同程序中共享一個(gè)Activity
四.scheme跳轉(zhuǎn)協(xié)議
Android中的Scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議趣斤,通過(guò)自定義Scheme協(xié)議,可以跳轉(zhuǎn)到app中的任何頁(yè)面浓领。
1.服務(wù)器可以定制化跳轉(zhuǎn)app頁(yè)面
2.app可以通過(guò)Scheme跳轉(zhuǎn)到另一個(gè)app頁(yè)面
3.可以通過(guò)h5頁(yè)面跳轉(zhuǎn)app原生頁(yè)面
fragment面試詳解
一.fragment為什么會(huì)稱為第五大組件
Android有四大組件,activity势腮,broadcastReceiver联贩,service,contentprovider捎拯。沒(méi)錯(cuò)泪幌,可是我覺(jué)得Fragment的作用不亞于它們,因此自封為第五大組件署照。
二.fragment加載到activity的兩種方式
1.添加fragment到activity的布局文件當(dāng)中
靜態(tài)啟動(dòng):所謂的靜態(tài)啟動(dòng)就是在xml文件中指定該fragment組件
2.動(dòng)態(tài)在activity中添加fragment
所謂的動(dòng)態(tài)啟動(dòng)祸泪,就是通過(guò)代碼啟動(dòng)fragment:
三.FragmentPageAdapter和FragmentPageStateAdapter的區(qū)別
FragmentPageAdapter在每次切換頁(yè)面的的時(shí)候,是將Fragment進(jìn)行分離建芙,適合頁(yè)面較少的Fragment使用以保存一些內(nèi)存禁荸,對(duì)系統(tǒng)內(nèi)存不會(huì)多大影響
FragmentPageStateAdapter在每次切換頁(yè)面的時(shí)候右蒲,是將Fragment進(jìn)行回收,適合頁(yè)面較多的Fragment使用翰撑,這樣就不會(huì)消耗更多的內(nèi)存
四.fragment的通信
1.在fragment調(diào)用activity方法? getActivity()
2.在activity調(diào)用fragment方法 接口回調(diào)
3.在fragment調(diào)用fragment方法 findFragmentById
新的方案回答?
方案一,? ?handler方案
activity向fragment傳遞消息
activity響應(yīng)事件乓土,發(fā)送msg喳挑,到fragment中唯袄,而fragment中用來(lái)接收msg,所以用注冊(cè)Handler對(duì)象翻伺,activity中發(fā)送msg的對(duì)象與fragment中handler對(duì)象必須為同一個(gè)(handler姐浮,msgqueen和looper相互唯一綁定)蟀瞧,所以要在activity中暴露pubilic方法讓fragment的acttch周期中傳遞handler
方案二,利用廣播的方式
在fragment中發(fā)送廣播,在activity中注冊(cè)廣播接收者
方案三笛谦、使用EventBus3.0通信*
EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線
方案四赋除,使用接口’
在fragment中創(chuàng)建接口箕肃,activity實(shí)現(xiàn)接口中方法督函,完成回調(diào)和參數(shù)傳遞嘀粱。
總結(jié):
如果項(xiàng)目中fragment不是很多話,可以用廣播傳遞辰狡,注意廣播的注銷锋叨,也比較簡(jiǎn)單。
最后不要使用Handler宛篇,耦合比較高娃磺,處理不好容易內(nèi)存泄露,無(wú)法獲取activity返回值
EventBus采用反射機(jī)制叫倍,造成性能上問(wèn)題偷卧,無(wú)法獲取activity的返回值
普通接口豺瘤,用于少量fragment中,性能還不錯(cuò)听诸,怕擴(kuò)展坐求。
五.fragment的replace,add,remove三個(gè)方法
Service面試詳解
一.service是什么?
四大組件之一,service是一個(gè)一種可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而沒(méi)有用戶界面的應(yīng)用組件
二service啟動(dòng)方式
1.startService
1.定義一個(gè)類繼承service
2.在manifest.xml文件中配置該service
3.使用context的startService(intent)啟動(dòng)該service
4.不再使用時(shí),調(diào)用stopService(Intent)停止該服務(wù)
2.bindService
1.創(chuàng)建bindService服務(wù)段,繼承自service并在類中,創(chuàng)建一個(gè)實(shí)現(xiàn)binder接口的實(shí)例對(duì)象并提供公共方法給客戶端調(diào)用
2從onbind()回調(diào)方法返回此binder實(shí)例
3在客戶端中,從onserviceconnected()回調(diào)方法接收binder,并使用提供的方法調(diào)用綁定服務(wù)
BroadCast receiver面試詳情
一.廣播定義
在android中,broadcast是一種廣泛的運(yùn)用的在應(yīng)用程序直接傳輸信息的機(jī)制,android中我們要發(fā)送的廣播內(nèi)容是一個(gè)intent,這個(gè)intent中可以攜帶我們要傳送的數(shù)據(jù)
二.廣播使用場(chǎng)景
1.同一個(gè)app具有多個(gè)進(jìn)程的不同組件之間的消息通信
2.不同app之間的組件之間消息通信
三.實(shí)現(xiàn)廣播-receiver
1.靜態(tài)注冊(cè):注冊(cè)完成就一直運(yùn)行
2.動(dòng)態(tài)注冊(cè):跟隨activity的生命周期
webview面試詳解
一.webview常見(jiàn)的一些坑
1. webview 在android api16以及之前版本的安全漏洞晌梨,該漏洞是因?yàn)槌绦驔](méi)有正確的限制webview.addjavascriptinterface方法桥嗤,讓遠(yuǎn)程攻擊者可以使用java的反射機(jī)制利用該漏洞執(zhí)行任意的java對(duì)象方法。
2. webview動(dòng)態(tài)添加到其他布局的時(shí)候仔蝌,在activity銷毀的生命周期時(shí)泛领,需要主動(dòng)調(diào)用webview.removeallviews和webview的ondestory方法釋放內(nèi)存,否則會(huì)導(dǎo)致內(nèi)存泄漏掌逛。
3. jsbridge 师逸,js橋可以允許遠(yuǎn)程網(wǎng)頁(yè)端與android的native端進(jìn)行通信司倚,通俗的說(shuō)就是使用js橋可以在android代碼中調(diào)用網(wǎng)頁(yè)的js方法豆混,也可以讓js調(diào)用原生的代碼
4. 當(dāng)前正在加載的網(wǎng)頁(yè)產(chǎn)生跳轉(zhuǎn)的時(shí)候這個(gè)方法可能會(huì)被多次調(diào)用,所以當(dāng)你的WebView需要加載各種各樣的網(wǎng)頁(yè)并且需要在頁(yè)面加載完成時(shí)采取一些操作的話动知,可以在WebChromeClient.onProgressChanged()中處理原本用WebViewClient.onPageFinished()執(zhí)行的操作
5.webview硬件加速導(dǎo)致渲染問(wèn)題皿伺,比如加載的時(shí)候會(huì)有閃屏現(xiàn)象,解決方式就是暫時(shí)關(guān)閉硬件加速盒粮。
handler面試詳解
一.handlerd的工作原理
處理過(guò)程:?
從handler中獲取一個(gè)消息對(duì)象鸵鸥,把數(shù)據(jù)封裝到消息對(duì)象中,通過(guò)handler的send…方法把消息push到MessageQueue隊(duì)列中丹皱。?
Looper對(duì)象會(huì)輪詢MessageQueue隊(duì)列妒穴,把消息對(duì)象取出。?
通過(guò)dispatchMessage分發(fā)給Handler摊崭,再回調(diào)用Handler實(shí)現(xiàn)的handleMessage方法處理消息讼油。
流程圖:?
Handler的實(shí)現(xiàn)中適及以下對(duì)象:?
1、Handler本身:負(fù)責(zé)消息的發(fā)送和處理?
2呢簸、Message:消息對(duì)象?
3矮台、MessageQueue:消息隊(duì)列(用于存放消息對(duì)象的數(shù)據(jù)結(jié)構(gòu))?
4、Looper:消息隊(duì)列的處理者(用于輪詢消息隊(duì)列的消息對(duì)象根时,取出后回調(diào)handler的dispatchMessage進(jìn)行消息的分發(fā)瘦赫,dispatchMessage方法會(huì)回調(diào)handleMessage方法把消息傳入,由Handler的實(shí)現(xiàn)類來(lái)處理)
Message對(duì)象的內(nèi)部實(shí)現(xiàn)是鏈表蛤迎,最大長(zhǎng)度是50确虱,用于緩存消息對(duì)象,達(dá)到重復(fù)利用消息對(duì)象的目的替裆,以減少消息對(duì)象的創(chuàng)建校辩,所以通常我們要使用obtainMessage方法來(lái)獲取消息對(duì)象
安全:Handler的消息處理機(jī)制是線程安全的
關(guān)系:創(chuàng)建Handler時(shí)會(huì)創(chuàng)建Looper唱较,Looper對(duì)象的創(chuàng)建又創(chuàng)建了MessageQueue
view繪制機(jī)制
一.View結(jié)構(gòu)原理
View定義了繪圖的基本操作基本操作由三個(gè)函數(shù)完成:measure()、layout()召川、draw()南缓,其內(nèi)部又分別包含了onMeasure()、onLayout()荧呐、onDraw()三個(gè)子方法汉形。具體操作如下:
1、measure操作? ? ?measure操作主要用于計(jì)算視圖的大小倍阐,即視圖的寬度和長(zhǎng)度概疆。在view中定義為final類型,要求子類不能修改峰搪。measure()函數(shù)中又會(huì)調(diào)用下面的函數(shù):? ? ?
(1)onMeasure()岔冀,視圖大小的將在這里最終確定,也就是說(shuō)measure只是對(duì)onMeasure的一個(gè)包裝概耻,子類可以覆寫onMeasure()方法實(shí)現(xiàn)自己的計(jì)算視圖大小的方式使套,并通過(guò)setMeasuredDimension(width, height)保存計(jì)算結(jié)果。?
2鞠柄、layout操作? ? ?layout操作用于設(shè)置視圖在屏幕中顯示的位置侦高。在view中定義為final類型,要求子類不能修改厌杜。layout()函數(shù)中有兩個(gè)基本操作:? ? ?(1)setFrame(l,t,r,b)奉呛,l,t,r,b即子視圖在父視圖中的具體位置,該函數(shù)用于將這些參數(shù)保存起來(lái)夯尽;? ? ?
(2)onLayout()瞧壮,在View中這個(gè)函數(shù)什么都不會(huì)做,提供該函數(shù)主要是為viewGroup類型布局子視圖用的匙握;?
3咆槽、draw操作? ? ?draw操作利用前兩部得到的參數(shù),將視圖顯示在屏幕上肺孤,到這里也就完成了整個(gè)的視圖繪制工作罗晕。子類也不應(yīng)該修改該方法,因?yàn)槠鋬?nèi)部定義了繪圖的基本操作:? ? ?
(1)繪制背景赠堵;? ? ?
(2)如果要視圖顯示漸變框小渊,這里會(huì)做一些準(zhǔn)備工作;? ? ?
(3)繪制視圖本身茫叭,即調(diào)用onDraw()函數(shù)酬屉。在view中onDraw()是個(gè)空函數(shù),也就是說(shuō)具體的視圖都要覆寫該函數(shù)來(lái)實(shí)現(xiàn)自己的顯示(比如TextView在這里實(shí)現(xiàn)了繪制文字的過(guò)程)。而對(duì)于ViewGroup則不需要實(shí)現(xiàn)該函數(shù)呐萨,因?yàn)樽鳛槿萜魇恰皼](méi)有內(nèi)容“的杀饵,其包含了多個(gè)子view,而子View已經(jīng)實(shí)現(xiàn)了自己的繪制方法谬擦,因此只需要告訴子view繪制自己就可以了切距,也就是下面的dispatchDraw()方法;? ? ?
(4)繪制子視圖,即dispatchDraw()函數(shù)惨远。在view中這是個(gè)空函數(shù)谜悟,具體的視圖不需要實(shí)現(xiàn)該方法,它是專門為容器類準(zhǔn)備的北秽,也就是容器類必須實(shí)現(xiàn)該方法葡幸;? ? ?
(5)如果需要(應(yīng)用程序調(diào)用了setVerticalFadingEdge或者setHorizontalFadingEdge),開(kāi)始繪制漸變框贺氓;? ? ?
(6)繪制滾動(dòng)條蔚叨;? ? ? 從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個(gè)方法。
事件分發(fā)機(jī)制
請(qǐng)謹(jǐn)記:Android事件分發(fā)流程 =?Activity -> ViewGroup -> View
即:1個(gè)點(diǎn)擊事件發(fā)生后辙培,事件先傳到Activity蔑水、再傳到ViewGroup、最終再傳到?View
從上可知虏冻,要想充分理解Android分發(fā)機(jī)制肤粱,本質(zhì)上是要理解:
Activity對(duì)點(diǎn)擊事件的分發(fā)機(jī)制
ViewGroup對(duì)點(diǎn)擊事件的分發(fā)機(jī)制
View對(duì)點(diǎn)擊事件的分發(fā)機(jī)制
即按順序講解:Activity事件分發(fā)機(jī)制弹囚、ViewGroup事件分發(fā)機(jī)制厨相、View事件分發(fā)機(jī)制
1.Activity的事件分發(fā)機(jī)制
當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí),事件最先傳到Activity的dispatchTouchEvent()進(jìn)行事件分發(fā)
當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí)鸥鹉,從Activity的事件分發(fā)開(kāi)始(Activity.dispatchTouchEvent())
方法總結(jié)
2 ViewGroup事件的分發(fā)機(jī)制
ViewGroup事件分發(fā)機(jī)制從dispatchTouchEvent()開(kāi)始
結(jié)論:Android事件分發(fā)總是先傳遞到ViewGroup蛮穿、再傳遞到View
過(guò)程:當(dāng)點(diǎn)擊了某個(gè)控件時(shí)
示意圖
核心方法總結(jié)
示意圖
3 View事件的分發(fā)機(jī)制
View事件分發(fā)機(jī)制從dispatchTouchEvent()開(kāi)始
每當(dāng)控件被點(diǎn)擊時(shí):
示意圖
注:onTouch()的執(zhí)行 先于?onClick()
核心方法總結(jié)
2.4 總結(jié)
okhttp網(wǎng)絡(luò)框架
一,get請(qǐng)求的使用方法
使用OKHttp進(jìn)行網(wǎng)絡(luò)請(qǐng)求支持兩種方式毁渗,一種是同步請(qǐng)求践磅,一種是異步請(qǐng)求
private void postDataWithParame() {
? ? OkHttpClient client = new OkHttpClient();//創(chuàng)建OkHttpClient對(duì)象。? ? FormBody.Builder formBody = new FormBody.Builder();//創(chuàng)建表單請(qǐng)求體? ? formBody.add("username","zhangsan");//傳遞鍵值對(duì)參數(shù)? ? Request request = new Request.Builder()//創(chuàng)建Request 對(duì)象灸异。? ? ? ? ? ? .url("http://www.baidu.com")
? ? ? ? ? ? .post(formBody.build())//傳遞請(qǐng)求體? ? ? ? ? ? .build();
? ? client.newCall(request).enqueue(new Callback() {府适。。肺樟。});//回調(diào)方法的使用與get異步請(qǐng)求相同檐春,此時(shí)略。}
retrofit網(wǎng)絡(luò)框架
Retrofit是Square開(kāi)源的一款適用于Android網(wǎng)絡(luò)請(qǐng)求的框架么伯。Retrofit底層是基于OkHttp實(shí)現(xiàn)的疟暖,與其他網(wǎng)絡(luò)框架不同的是,它更多使用運(yùn)行時(shí)注解的方式提供功能。
步驟1:添加Retrofit庫(kù)的依賴?
1. build.gradle? ????????????????????????????????????????????????????????????????????????????????????????????????? dependencies {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?compile 'com.squareup.retrofit2:retrofit:2.0.2' // Retrofit庫(kù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????compile 'com.squareup.okhttp3:okhttp:3.1.2' // Okhttp庫(kù)???????????????????????????????????????????????? }
2. 添加 網(wǎng)絡(luò)權(quán)限?AndroidManifest.xml
步驟2:創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類?
步驟3:創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口?
步驟4:創(chuàng)建 Retrofit 實(shí)例?
步驟5:創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口實(shí)例 并 配置網(wǎng)絡(luò)請(qǐng)求參數(shù)?
步驟6:發(fā)送網(wǎng)絡(luò)請(qǐng)求(異步 / 同步)
封裝了 數(shù)據(jù)轉(zhuǎn)換俐巴、線程切換的操作
步驟7:?處理服務(wù)器返回的數(shù)據(jù)
recyclerview面試詳解
一.recyclerview是Android 5.0推出的骨望,是support-v7包中的新組件。
第一步欣舵,導(dǎo)入support-v7包
第二步:初始化recycleview
第三步:寫adapter擎鸠,這里是填viewholder的,這個(gè)viewholder就是我下面寫的myholder缘圈。
二.recyclerview加載卡頓
主要就是對(duì)onScrollStateChanged方法進(jìn)行監(jiān)聽(tīng)糠亩,然后通知adapter是否加載圖片或復(fù)雜布局。對(duì)于復(fù)雜布局的優(yōu)化效果還是很明顯的准验。
listview優(yōu)化方案
一.convertView的使用赎线,主要優(yōu)化加載布局問(wèn)題
1.listivew每次滾動(dòng)都會(huì)調(diào)用gitview()方法,所以優(yōu)化gitview是重中之重糊饱。
二.內(nèi)部類ViewHolder的使用垂寥。主要優(yōu)化加載控件
主要優(yōu)化getView方法中每次回調(diào)用findviewByID()方法來(lái)獲取一次控件的代碼。
新增加內(nèi)部類ViewHolder,用于對(duì)控件的實(shí)力存儲(chǔ)進(jìn)行緩存另锋。
convertView為空時(shí)滞项,viewHolder會(huì)將空間的實(shí)力存放在ViewHolder里,然后用setTag方法講viewHolder對(duì)象存儲(chǔ)在view里夭坪。
convertView不為空時(shí)文判,用getTag方法獲取viewHolder對(duì)象.
三.有沒(méi)有想過(guò)ListView加載成千上萬(wàn)的數(shù)據(jù)為什么不出OOM錯(cuò)誤?
最主要的是因?yàn)镽ecycleBin機(jī)制室梅。
RecycleBin中有兩個(gè)重要的View數(shù)組戏仓,分別是mActiveViews和mScrapViews。
這兩個(gè)數(shù)組中所存儲(chǔ)的View都是用來(lái)復(fù)用的亡鼠,只不過(guò)mActiveViews中存儲(chǔ)的是OnScreen的View赏殃,這些View很有可能被直接復(fù)用;而mScrapViews中存儲(chǔ)的是OffScreen的View间涵,這些View主要是用來(lái)間接復(fù)用的仁热。
Android常用性能優(yōu)化方案
一.布局優(yōu)化
1)HTTP請(qǐng)求方式
這里指的是客戶端與服務(wù)端交互,拿到數(shù)據(jù)勾哩、解析抗蠢、再到顯示到界面整個(gè)過(guò)程耗費(fèi)的時(shí)間。
這個(gè)部分涉及客戶端的優(yōu)化思劳,也涉及服務(wù)端的優(yōu)化迅矛,這里只討論客戶端。
使用優(yōu)秀的開(kāi)源Http框架是我們比較好的選擇敢艰,它的優(yōu)點(diǎn)是經(jīng)過(guò)市場(chǎng)的驗(yàn)證. 加快響應(yīng)速度(網(wǎng)絡(luò)請(qǐng)求框架)诬乞。
2)數(shù)據(jù)解析
實(shí)際開(kāi)發(fā)當(dāng)中服務(wù)端的返回?cái)?shù)據(jù)格式無(wú)非就兩種:
- JSON
- XML
在Android中均可以使用優(yōu)秀的解析庫(kù)來(lái)加快我們的解析速度,XML中有dom4j,JSON有Jackson震嫉、Gson森瘪,我們通過(guò)這些庫(kù)實(shí)現(xiàn)我們更快的完成數(shù)據(jù)解析,提高我們的開(kāi)發(fā)效率票堵。
3)數(shù)據(jù)存儲(chǔ)
為了提高應(yīng)用程序的響應(yīng)時(shí)間扼睬,數(shù)據(jù)緩存是一個(gè)比較好的方式,我們可以預(yù)處理服務(wù)器返回的數(shù)據(jù)悴势,對(duì)數(shù)據(jù)進(jìn)行緩存刷新窗宇。
-?異步請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)
-?預(yù)處理服務(wù)器返回?cái)?shù)據(jù)
-?異步進(jìn)行數(shù)據(jù)存儲(chǔ)操作
-?數(shù)據(jù)緩存刷新
- Timeout超時(shí)重試
-?在主線程中操作UI
二.界面卡頓
ANR表示”應(yīng)用程序無(wú)響應(yīng)”,這個(gè)是需要我們避免發(fā)生的事情特纤,出現(xiàn)這個(gè)異常的原因:
-?主線程?(“事件處理線程”?/?“UI線程”)?在5秒內(nèi)沒(méi)有響應(yīng)輸入事件
- BroadcastReceiver在10秒內(nèi)沒(méi)有執(zhí)行完畢
導(dǎo)致ANR的原因有很多军俊,一般情況就是在UI線程做了耗時(shí)的操作,例如”網(wǎng)絡(luò)請(qǐng)求”捧存、數(shù)據(jù)庫(kù)操作粪躬。
那么如何避免?
-?UI線程只做界面刷新昔穴,不做任何耗時(shí)操作镰官,耗時(shí)操作放在子線程來(lái)做
-?可以使用Thread+handle或者AsyncTask來(lái)進(jìn)行邏輯處理
三.ListView和Bitmap優(yōu)化
listView優(yōu)化主要分為三個(gè)方面:
(1)使用ViewHolder并避免在getView方法中執(zhí)行耗時(shí)操作?
(2)根據(jù)列表的滑動(dòng)狀態(tài)來(lái)控制任務(wù)的執(zhí)行頻率,比如當(dāng)列表快速滑動(dòng)時(shí)不適合開(kāi)啟大量的異步任務(wù)吗货,?
(3)使用硬件加速來(lái)使listView的滑動(dòng)更加流暢
Bitmap優(yōu)化:
主要是通過(guò)BitmapFactory.Options來(lái)根據(jù)需要對(duì)圖片進(jìn)行采樣泳唠,采樣的過(guò)程主要使用到了BitmapFactory.Options?
來(lái)根據(jù)需要對(duì)圖片進(jìn)行采樣,采樣的過(guò)程主要使用到了BitmapFactory.Options的inSampleSize參數(shù)
四.線程優(yōu)化
線程優(yōu)化的思想是采用線程池宙搬,避免程序中存在大量的Thread笨腥。線程池可以重用內(nèi)部的線程,從而避免了線程的創(chuàng)建和銷毀帶來(lái)的性能開(kāi)銷害淤,同時(shí)線程池可以有效的控制線程的最大并發(fā)數(shù)扇雕,避免了大量線程因互相搶占系統(tǒng)資源而導(dǎo)致阻塞現(xiàn)象的發(fā)生。因此在實(shí)際開(kāi)發(fā)中應(yīng)盡量采用線程池窥摄,而不是每次都要?jiǎng)?chuàng)建一個(gè)Thread對(duì)象。
五.代碼優(yōu)化
?對(duì)常量使用static修飾符
-?使用靜態(tài)方法
-?減少不必要的成員變量
-?盡量不要使用枚舉础淤,少用迭代器
-?對(duì)Cursor崭放、Receiver、Sensor鸽凶、File等對(duì)象币砂,要注意它們的創(chuàng)建、回收與注冊(cè)玻侥、反注冊(cè)
-?避免大量使用注解决摧、反射
-?使用RenderScript、OpenGL來(lái)進(jìn)行復(fù)雜的繪圖操作
-?使用SurfaceView來(lái)替代View進(jìn)行大量、頻繁的繪圖操作
-?盡量使用視圖緩存掌桩,而不是每次都執(zhí)行inflate()方法解析視圖
Android中常見(jiàn)的設(shè)計(jì)模式
設(shè)計(jì)模式有23種 說(shuō)說(shuō)幾種常見(jiàn)的設(shè)計(jì)模式
1.單例模式:
單例模式太多了边锁,在整個(gè)應(yīng)用中只有一個(gè),標(biāo)準(zhǔn)的單例模式寫法:
2.Builder模式
常見(jiàn)的builder模式有創(chuàng)建dialog的過(guò)程波岛。
3.策略方法模式
比如在注冊(cè)一個(gè)用戶信息時(shí)茅坛,可能最終會(huì)注冊(cè)到不同的服務(wù)器上,但是對(duì)于上層代碼并不關(guān)心最終用戶數(shù)據(jù)到哪则拷,只需要有地方存儲(chǔ)就可以贡蓖,所以可以抽象出存儲(chǔ)函數(shù),真正的實(shí)現(xiàn)讓其實(shí)現(xiàn)的子類去做煌茬。
4.工廠方法模式
我們創(chuàng)建的activity或者fragment中斥铺,定義基類的時(shí)候,可以將每個(gè)界面不同的地方抽象出來(lái)坛善,讓真正實(shí)現(xiàn)的子類去實(shí)現(xiàn)該統(tǒng)一的方法仅父。
5.觀察者模式
在安卓中觀察者模式用的比較多的地方在數(shù)據(jù)庫(kù)變化或者listview內(nèi)容有變化時(shí),使用notifyDataSetChanged()方法浑吟。
6.組合模式
這種模式在安卓中最常見(jiàn)笙纤,Android中的view是一種樹(shù)形結(jié)構(gòu),每個(gè)viewGroup包含一些列的view组力,而每個(gè)viewGroup本身又可以當(dāng)做一個(gè)view省容,所以最終手機(jī)上呈現(xiàn)出來(lái)的界面,是由一個(gè)個(gè)view組合而成的燎字。
7.適配模式
其實(shí)適配器模式很容易理解腥椒,我們?cè)贏ndroid開(kāi)發(fā)時(shí)也經(jīng)常用到。比較典型的有ListView和RecyclerView候衍。為什么ListView需要使用適配器呢笼蛛?主要是,ListView只關(guān)心它的每個(gè)ItemView蛉鹿,而不關(guān)心這個(gè)ItemView具體顯示的是什么滨砍。而我們的數(shù)據(jù)源存放的是要顯示的內(nèi)容,它保存了每一個(gè)ItemView要顯示的內(nèi)容妖异。ListView和數(shù)據(jù)源之間沒(méi)有任何關(guān)系惋戏,這時(shí)候,需要通過(guò)適配器他膳,適配器提供getView方法給ListView使用响逢,每次ListView只需提供位置信息給getView函數(shù),然后getView函數(shù)根據(jù)位置信息向數(shù)據(jù)源獲取對(duì)應(yīng)的數(shù)據(jù)棕孙,根據(jù)數(shù)據(jù)返回不同的View舔亭。
8.模板方法模式
這種模式也相當(dāng)常見(jiàn)些膨,比如我們的activity或者fragment,在base中定義了一些列的周期函數(shù)钦铺,基本把整個(gè)activity的框架全部定義好了订雾,所以我們只需要進(jìn)程基類的activity或者fragment方法,然后在定義好的周期函數(shù)中實(shí)現(xiàn)我們需要的內(nèi)容就可以职抡,而不用關(guān)心整個(gè)activity的啟動(dòng)所有過(guò)程葬燎。
9.代理模式
定義:為其他類提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)。
在安卓中進(jìn)程通信是一個(gè)很常見(jiàn)的東西缚甩,如果需要進(jìn)行進(jìn)程通信則可以通過(guò)使用AIDL來(lái)獲取遠(yuǎn)程service的代理谱净,然后我們可以通過(guò)這個(gè)代理來(lái)執(zhí)行響應(yīng)的操作。
java的三大特性
java有三大特性:封裝擅威,繼承和多態(tài)壕探。
一.封裝
1. 封裝就是將類的信息隱藏在類內(nèi)部,不允許外部程序直接訪問(wèn)郊丛,而是通過(guò)該類的方法實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問(wèn)李请。
2. 封裝是怎么實(shí)現(xiàn)的呢?
? ?a. 需要修改屬性的訪問(wèn)控制符(修改為private)厉熟;
? ?b. 創(chuàng)建getter/setter方法(用于屬性的讀寫)导盅;
? ?c. 在getter/setter方法中加入屬性控制語(yǔ)句(用于判斷屬性值的合法性);
二.繼承
繼承是類與類的一種關(guān)系,在Java中是單繼承的揍瑟,也就是說(shuō)一個(gè)子類只有一個(gè)父類白翻。
三.多態(tài)
多態(tài)指的是對(duì)象的多種形態(tài)。多態(tài)有兩種:引用多態(tài)和方法多態(tài)绢片。繼承是多態(tài)的實(shí)現(xiàn)基礎(chǔ)滤馍。
1.引用多態(tài)
父類的引用可以指向本類的對(duì)象;父類的引用可以指向子類的對(duì)象底循。
2. 方法多態(tài)
創(chuàng)建父類對(duì)象時(shí)巢株,調(diào)用的方法為父類方法;
創(chuàng)建子類對(duì)象時(shí)熙涤,調(diào)用的方法是子類重寫的方法或繼承自父類的方法阁苞;
注意:不允許通過(guò)父類的引用調(diào)用子類獨(dú)有的方法。?
EventBus的基本用法
我需要在一個(gè)Activity里注冊(cè)EventBus事件灭袁,然后定義接收方法猬错,這跟Android里的廣播機(jī)制很像,你需要首先注冊(cè)廣播茸歧,然后需要編寫內(nèi)部類,實(shí)現(xiàn)接收廣播显沈,然后操作UI软瞎。所以逢唤,在EventBus中,你同樣得這么做涤浇。
Android三大圖片加載框架
一.ImageLoader框架
是很早開(kāi)源的圖片緩存鳖藕,在早期被很多應(yīng)用使用
1.多線程下載圖片,圖片可以來(lái)源于網(wǎng)絡(luò)只锭,文件系統(tǒng)著恩,項(xiàng)目文件夾assets中以及drawable中等
2.支持隨意的配置ImageLoader,例如線程池蜻展,圖片下載器喉誊,內(nèi)存緩存策略,硬盤緩存策略纵顾,圖片顯示選項(xiàng)以及其他的一些配置
3.支持圖片的內(nèi)存緩存伍茄,文件系統(tǒng)緩存或者SD卡緩存
4.支持圖片下載過(guò)程的監(jiān)聽(tīng)
5.根據(jù)控件(ImageView)的大小對(duì)Bitmap進(jìn)行裁剪,減少Bitmap占用過(guò)多的內(nèi)存
6.較好的控制圖片的加載過(guò)程施逾,例如暫停圖片加載敷矫,重新開(kāi)始加載圖片,一般使用在ListView,GridView中汉额,滑動(dòng)過(guò)程中暫停加載圖片曹仗,停止滑動(dòng)的時(shí)候去加載圖片
7.提供在較慢的網(wǎng)絡(luò)下對(duì)圖片進(jìn)行加載
8. 默認(rèn)實(shí)現(xiàn)多種內(nèi)存緩存算法這幾個(gè)圖片緩存都可以配置緩存算法,不過(guò) ImageLoader 默認(rèn)實(shí)現(xiàn)了較多緩存算法蠕搜,如 Size 最大先刪除怎茫、使用最少先刪除、最近最少使用讥脐、先進(jìn)先刪除遭居、時(shí)間最長(zhǎng)先刪除等。
設(shè)計(jì)原理
二旬渠、Picasso介紹
?picasso是Square公司開(kāi)源的一個(gè)Android圖形緩存庫(kù),可以實(shí)現(xiàn)圖片下載和緩存功能
? ?Picasso不僅實(shí)現(xiàn)了圖片異步加載的功能俱萍,還解決了android中加載圖片時(shí)需要解決的一些常見(jiàn)問(wèn)題:
? ?1.在adapter中需要取消已經(jīng)不在視野范圍的ImageView圖片資源的加載,否則會(huì)導(dǎo)致圖片錯(cuò)位告丢,Picasso已經(jīng)解決了這個(gè)問(wèn)題枪蘑。
? ?2.使用復(fù)雜的圖片壓縮轉(zhuǎn)換來(lái)盡可能的減少內(nèi)存消耗
? ?3.自帶內(nèi)存和硬盤二級(jí)緩存功能
?三、Glide簡(jiǎn)介
?Glide是一個(gè)高效岖免、開(kāi)源岳颇、Android設(shè)備上的媒體管理框架,Glide具有獲取颅湘、解碼和展示視頻劇照话侧、圖片、動(dòng)畫等功能闯参,它還有靈活的API瞻鹏,這些API使開(kāi)發(fā)者能夠?qū)lide應(yīng)用在幾乎任何網(wǎng)絡(luò)協(xié)議棧里悲立。創(chuàng)建Glide的主要目的有兩個(gè),一個(gè)是實(shí)現(xiàn)平滑的圖片列表滾動(dòng)效果(滾動(dòng)流暢)新博,另一個(gè)是支持遠(yuǎn)程圖片的獲取薪夕、大小調(diào)整和展示
Toolbar面試詳解
今天面試問(wèn)我Toolbar是什么,當(dāng)時(shí)我一臉懵逼,畢竟之前都是自定義導(dǎo)航,后來(lái)網(wǎng)上了解了一下
Toolbar是什么
Toolbar是Google在Android 5.0中推出的一款替代ActionBar的View。ActionBar必須得作為Activity內(nèi)容的一部分赫悄,而Toolbar可以放在任何層次原献。Toolbar比ActionBar支持更多的功能,從開(kāi)始到終點(diǎn)埂淮,Toolbar包含下面可選的元素:?
- 一個(gè)導(dǎo)航按鈕姑隅。 可以是一個(gè)向前的按鈕腥光、導(dǎo)航菜單按鈕三椿,等等构诚。?
- 一個(gè)logo圖片?
- 標(biāo)題和副標(biāo)題?
- 一個(gè)或多個(gè)自定義一View?
- 一個(gè)menu
mvc mvp mvvm區(qū)別
MVC模式:
1. MVC的所有通信都是單向的酬土。
2.?view傳送指令到controller(用戶也可以直接將指令傳到controller)岗仑。
3.?controller完成業(yè)務(wù)邏輯后要求model改變狀態(tài)阿趁。
4.?model將新的數(shù)據(jù)發(fā)送到view厢汹,用戶得到反饋灰殴。
MVP模式:
MVP模式將Controller改名為Presenter霹俺,同時(shí)改變了通信方向柔吼。
1. 各部分之間的通信都是雙向的。
2. View與Model不發(fā)生聯(lián)系丙唧,都通過(guò)Presenter傳遞
3. ?View非常薄愈魏,不部署任何業(yè)務(wù)邏輯,稱為“被動(dòng)視圖”想际,即沒(méi)有任何主動(dòng)性培漏,而Presenter非常厚,所有邏輯都部署在這里胡本。
MVVM模式:
MVVM 模式將 Presenter 改名為 ViewModel牌柄,基本上與 MVP 模式完全一致。
唯一的區(qū)別是侧甫,它采用雙向綁定(data-binding):View的變動(dòng)珊佣,自動(dòng)反映在 ViewModel,反之亦然披粟。Angular?和?Ember?都采用這種模式