1.網(wǎng)絡(luò)請(qǐng)求:volley,OKHttp網(wǎng)絡(luò)框架可以寫這倆
2.圖片加載:Glide,Universal-Image-Loader,圖片框架可以這倆選一個(gè)寫
圖片OOM的情況,就主要是說(shuō)要自己之前的時(shí)候用雙緩存,MemoryCache和DiskCache,再深點(diǎn)就是怎么快速找到,就說(shuō)把圖片的URL生成一個(gè)hashmap存在緩存中,取圖片的時(shí)候先判斷內(nèi)存緩存中有沒有,有直接取出,沒有去磁盤緩存取,沒有的話在從網(wǎng)絡(luò)取,緩存使用LRU算法快速找到其實(shí)就是用到一次就加到最前面,因?yàn)槟阏业臅r(shí)候要遍歷的盡量讓他在前面找到這樣就可以結(jié)束循環(huán)的快LinkedHashMap是有序的就等于是你把最常用的放到LinkedHashmap中
3.視圖注入:butterknife和Xutils可以選一個(gè),xutils是比較綜合的,網(wǎng)絡(luò),圖片,視圖注入和數(shù)據(jù)庫(kù)都有,butterknife只是視圖注入,所以如果要寫xutils的話不要單獨(dú)寫他是視圖注入框架視圖注入就是不用頻繁的寫findviewbyid,setonclick等這種操作,直接用@Viewinject,@onclick這種方法標(biāo)注就行
4.ORM關(guān)系型數(shù)據(jù)庫(kù)也是,GreenDao和Xutils二選一,就是數(shù)據(jù)庫(kù)中存的一條數(shù)據(jù)的字段和你程序中的Entity實(shí)體類一一對(duì)應(yīng)這樣你進(jìn)行CRUD操作的時(shí)候可以通過(guò)操作對(duì)象來(lái)實(shí)現(xiàn)(crud是增刪改查操作)框架也是操作的sqlite比如說(shuō)你的數(shù)據(jù)庫(kù)User表,有id,name,password,sex字段你在程序中中的User類,里面的成員屬性也是id,name,password,sex這樣你可以通過(guò)實(shí)例化一個(gè)數(shù)據(jù)庫(kù)操作對(duì)象來(lái)一句話實(shí)現(xiàn)CRUD操作比如添加一條數(shù)據(jù)dbutils.add(new User());
5.自定義view:http://blog.csdn.net/lmj623565791/article/details/24252901經(jīng)常問的問題①要重寫的方法 [ 、重寫onMesure ]重寫onDraw? ? 、重寫onMesure不一定是必須的②在布局文件中怎么引用? 一定要引入 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"我們的命名空間,后面的包路徑指的是項(xiàng)目的package③怎么獲得自己定義的樣式? /**? ? ? ? ? * 獲得我們所定義的自定義樣式屬性? ? ? ? ? */? ? ? ? ? TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);? ④這三個(gè)的區(qū)別? 重寫之前先了解MeasureSpec的specMode,一共三種類型:EXACTLY:一般是設(shè)置了明確的值或者是MATCH_PARENTAT_MOST:表示子布局限制在一個(gè)最大值內(nèi),一般為WARP_CONTENTUNSPECIFIED:表示子布局想要多大就多大,很少使用這幾個(gè)地方比較常用,還有的就直接問你怎么自定義view
6.java的基礎(chǔ)知識(shí):會(huì)問一些封裝繼承多態(tài)的問題 ,可以說(shuō)代碼用MVC架構(gòu),使用常用的設(shè)計(jì)模式? 設(shè)計(jì)模式你要記住最基本的幾種:?jiǎn)卫J?,工廠模式,抽象工廠模式,代理模式,適配器模式等? 單例模式最好自己能寫下來(lái),最簡(jiǎn)單的一種設(shè)計(jì)模式,我遇見過(guò)兩家公司讓你寫單例模式的? http://cantellow.iteye.com/blog/838473? 知道懶漢,餓漢,線程安全就可以了,不要寫最好的那種? 如果你記得住的話可以寫,一般寫出懶漢或者餓漢的一種就行? 但是要說(shuō)出來(lái)自己寫的是哪種? 其他的你記得住的話可以說(shuō)出來(lái)怎么寫,就不用全寫下來(lái)了? 記住? 懶漢,餓漢,線程安全這幾個(gè)詞,能說(shuō)出來(lái)更好
7.Retrofit? Rxjava? EventBusmvp mvvmAS 模板開發(fā)新添加的MD風(fēng)格的控件NavigationView側(cè)滑導(dǎo)航欄,tabLayout 和viewPager聯(lián)用的指示頁(yè)面的控件,Snackbar用法類似于Toast,一種底部彈出式的新消息提醒機(jī)制,CardView提供了一種類似于卡片(紙張?)風(fēng)格的布局樣式http://blog.csdn.net/cao861544325/article/details/48223587recycleview用的比較多GlideMVP+Retrofit+Rxjava? 你可以看看這個(gè)開源項(xiàng)目butterknifedaggergreendaogetItemViewType,getViewTypeCount? listview的item布局不同MVP模式的三個(gè)角色(1)Presenter – 交互中間人:Presenter主要作為溝通View與Model的橋梁,它從Model層檢索數(shù)據(jù)后,返回給View層,使得View與Model之間沒有耦合,也將業(yè)務(wù)邏輯從View角色上抽離出來(lái)。(2)View – 用戶界面:View通常是指Activity、Fragment或者某個(gè)View控件,它含有一個(gè)Presenter成員變量。通常View需要實(shí)現(xiàn)一個(gè)邏輯接口,將View上的操作轉(zhuǎn)交給Presenter進(jìn)行實(shí)現(xiàn),最后,Presenter 調(diào)用View邏輯接口將結(jié)果返回給View元素。(3)Model – 數(shù)據(jù)的存取:Model 角色主要是提供數(shù)據(jù)的存取功能。Presenter 需要通過(guò)Model層存儲(chǔ)、獲取數(shù)據(jù),Model就像一個(gè)數(shù)據(jù)倉(cāng)庫(kù)。更直白的說(shuō),Model是封裝了數(shù)據(jù)庫(kù)DAO或者網(wǎng)絡(luò)獲取數(shù)據(jù)的角色,或者兩種數(shù)據(jù)方式獲取的集合。從上圖可以看出:MVC的耦合性還是較高的,View可以直接訪問Model,導(dǎo)致3者之間構(gòu)成了回路。所以兩者的主要區(qū)別是,MVP中View不能直接訪問Model,需要通過(guò)Presenter發(fā)出請(qǐng)求,View與Model不能直接通信。與MVVM(Model-View-ViewModel)的區(qū)別MVVM與MVP非常相似,唯一區(qū)別是View和Model進(jìn)行雙向綁定,兩者之間有一方發(fā)生變化則會(huì)反應(yīng)到另一方上。MVVM模式有點(diǎn)像ListView與Adapter、數(shù)據(jù)集的關(guān)系,當(dāng)數(shù)據(jù)集發(fā)生變化時(shí),調(diào)用Adapter的notifyDataSetChanged之后View就直接更新,同時(shí)它們之間又沒有耦合,使得ListView變得更加靈活。View與Model并不直接交互,而是使用Presenter作為View與Model之間的橋梁。其中Presenter中同時(shí)持有Viwe層以及Model層的Interface的引用,而View層持有Presenter層Interface的引用。當(dāng)View層某個(gè)界面需要展示某些數(shù)據(jù)的時(shí)候,首先會(huì)調(diào)用Presenter層的某個(gè)接口,然后Presenter層會(huì)調(diào)用Model層請(qǐng)求數(shù)據(jù),當(dāng)Model層數(shù)據(jù)加載成功之后會(huì)調(diào)用Presenter層的回調(diào)方法通知Presenter層數(shù)據(jù)加載完畢,最后Presenter層再調(diào)用View層的接口將加載后的數(shù)據(jù)展示給用戶。這就是MVP模式的整個(gè)核心過(guò)程。對(duì)于一個(gè)應(yīng)用而言我們需要對(duì)它抽象出各個(gè)層面,而在MVP架構(gòu)中它將UI界面和數(shù)據(jù)進(jìn)行隔離,所以我們的應(yīng)用也就分為三個(gè)層次。View: 對(duì)于View層也是視圖層,在View層中只負(fù)責(zé)對(duì)數(shù)據(jù)的展示,提供友好的界面與用戶進(jìn)行交互。在Android開發(fā)中通常將Activity或者Fragment作為View層。Model: 對(duì)于Model層也是數(shù)據(jù)層。它區(qū)別于MVC架構(gòu)中的Model,在這里不僅僅只是數(shù)據(jù)模型。在MVP架構(gòu)中Model它負(fù)責(zé)對(duì)數(shù)據(jù)的存取操作,例如對(duì)數(shù)據(jù)庫(kù)的讀寫,網(wǎng)絡(luò)的數(shù)據(jù)的請(qǐng)求等。Presenter:對(duì)于Presenter層他是連接View層與Model層的橋梁并對(duì)業(yè)務(wù)邏輯進(jìn)行處理。在MVP架構(gòu)中Model與View無(wú)法直接進(jìn)行交互。所以在Presenter層它會(huì)從Model層獲得所需要的數(shù)據(jù),進(jìn)行一些適當(dāng)?shù)奶幚砗蠼挥蒝iew層進(jìn)行顯示。這樣通過(guò)Presenter將View與Model進(jìn)行隔離,使得View和Model之間不存在耦合,同時(shí)也將業(yè)務(wù)邏輯從View中抽離。RXJava? 異步? ? 觀察者模式觀察者模式面向的需求是:A 對(duì)象(觀察者)對(duì) B 對(duì)象(被觀察者)的某種變化高度敏感,需要在 B 變化的一瞬間做出反應(yīng)。舉個(gè)例子,新聞里喜聞樂見的警察抓小偷,警察需要在小偷伸手作案的時(shí)候?qū)嵤┳ゲ?。在這個(gè)例子里,警察是觀察者,小偷是被觀察者,警察需要時(shí)刻盯著小偷的一舉一動(dòng),才能保證不會(huì)漏過(guò)任何瞬間。程序的觀察者模式和這種真正的『觀察』略有不同,觀察者不需要時(shí)刻盯著被觀察者(例如 A 不需要每過(guò) 2ms 就檢查一次 B 的狀態(tài)),而是采用注冊(cè)(Register)或者稱為訂閱(Subscribe)的方式,告訴被觀察者:我需要你的某某狀態(tài),你要在它變化的時(shí)候通知我。 Android 開發(fā)中一個(gè)比較典型的例子是點(diǎn)擊監(jiān)聽器 OnClickListener 。對(duì)設(shè)置 OnClickListener 來(lái)說(shuō), View 是被觀察者, OnClickListener 是觀察者,二者通過(guò) setOnClickListener() 方法達(dá)成訂閱關(guān)系。訂閱之后用戶點(diǎn)擊按鈕的瞬間,Android Framework 就會(huì)將點(diǎn)擊事件發(fā)送給已經(jīng)注冊(cè)的 OnClickListener 。采取這樣被動(dòng)的觀察方式,既省去了反復(fù)檢索狀態(tài)的資源消耗,也能夠得到最高的反饋速度。當(dāng)然,這也得益于我們可以隨意定制自己程序中的觀察者和被觀察者,而警察叔叔明顯無(wú)法要求小偷『你在作案的時(shí)候務(wù)必通知我』。? android6.0進(jìn)入Material Design時(shí)代? ? Android控件使用 — 12個(gè)Material Design風(fēng)格控件的使用 1、AppBarLayout、ToolBar AppBarLayout 是繼承LinerLayout實(shí)現(xiàn)的一個(gè)ViewGroup容器組件,它是為了Material Design設(shè)計(jì)的App Bar,支持手勢(shì)滑動(dòng)操作。 AppBarLayout必須作為Toolbar的父布局容器,也可以配合CoordinatorLayout一起使用。 ToolBar是谷歌新推出的代替ActionBar的一個(gè)標(biāo)題欄控件,能將背景拓展到狀態(tài)欄,依賴包是v7,使用之前先把style中繼承的主題改為NoActionBar; 可以設(shè)置”標(biāo)題”,”副標(biāo)題”,”Logo”,”NavigationIcon”以及”Menu菜單”,也可以自定義布局;? toolbar fitsSystemWindows實(shí)現(xiàn)狀態(tài)欄各版本適配方案:1.Android5.0以上:material design風(fēng)格,半透明(APP 的內(nèi)容不被上拉到狀態(tài)) 2.Android4.4(kitkat)以上至5.0:全透明(APP 的內(nèi)容不被上拉到狀態(tài)) 3.Android4.4(kitkat)以下:不占據(jù)status bar 2、DrawerLayout、NavigationViewDrawerLayout可以輕松的實(shí)現(xiàn)抽屜效果、在DrawerLayout中,第一個(gè)子View必須是顯示內(nèi)容的view,第二個(gè)view是抽屜view,設(shè)置屬性layout_gravity=”left|right”,表示是從左邊滑出還是右邊滑出。 使用前需添加:compile 'com.android.support:design:23.3.0'第一個(gè)布局使用的是Framelayout,可以通過(guò)側(cè)滑抽屜欄的點(diǎn)擊顯示出不同的Fragment; 而抽屜布局用的是NavigationView,NavigationView需要接收幾個(gè)必要的參數(shù)、一個(gè)用于顯示頭部的布局以及用于顯示選項(xiàng)的菜單布局;可在xml中直接添加布局;3、RecyclerView、CardView、AutoScrollViewPagerRecyclerView是用于顯示大量數(shù)據(jù)的控件,有點(diǎn)類似與ListView、GirdView,相較而言,RecyclerView在靈活性、體驗(yàn)感上都有一個(gè)較大的提升,通過(guò)設(shè)置它提供的不同LayoutManager,ItemDecoration , ItemAnimator可以實(shí)現(xiàn)豐富的功能,依賴包是v7; RecyclerView也能像ListView一樣添加Header以及Footer,也可以通過(guò)addOnScrollListener進(jìn)行分頁(yè)加載;4、CoordinatorLayout、CollapsingToolbarLayout、TabLayoutCoordinatorLayout,一個(gè)從另一層面去控制子view之間觸摸事件的布局,在CoordinatorLayout的布局中使用了Toolbar ,允許你更加自由的自定義其外觀與布局的其余部分融為一體。使用AppBarLayout可以讓你的Toolbar與其他View(比如TabLayout的選項(xiàng)卡)能響應(yīng)被標(biāo)記了ScrollingViewBehavior的View的滾動(dòng)事件。 CollapsingToolbarLayout,可伸縮折疊的Toolbar ,直接添加Toolbar到AppBarLayout可以讓你使用enterAlwaysCollapsed和 exitUntilCollapsedscroll標(biāo)志,但是無(wú)法控制不同元素如何響應(yīng)collapsing的細(xì)節(jié)。這里使用了 CollapsingToolbarLayout的app:layout_collapseMode=”pin”來(lái)確保Toolbar在view折疊的時(shí)候仍然被固定在屏幕的頂部當(dāng)你讓CollapsingToolbarLayout和Toolbar在一起使用的時(shí)候,title 會(huì)在展開的時(shí)候自動(dòng)變得大些,而在折疊的時(shí)候讓字體過(guò)渡到默認(rèn)值。 TabLayout 既實(shí)現(xiàn)了固定的選項(xiàng)卡(View的寬度平均分配),也實(shí)現(xiàn)了可滾動(dòng)的選項(xiàng)卡(View寬度不固定同時(shí)可以橫向滾動(dòng))。如果你使用ViewPager在 tab之間橫向切換,你可以直接從PagerAdapter的getPageTitle() 中創(chuàng)建選項(xiàng)卡,然后使用setupWithViewPager()將兩者聯(lián)系在一起。它可以使tab的選中事件能更新ViewPager,同時(shí) ViewPager 的頁(yè)面改變能更新tab的選中狀態(tài)。 5、TextInputLayoutTextInputLayout 控件表現(xiàn)得就像LinearLayout 一樣,它是一個(gè)容器。TextInputLayout 中只能放一個(gè)子元素,和ScrollView有點(diǎn)類似,并且子元素必須是EditText; TextInputLayout 實(shí)現(xiàn)的功能就是當(dāng)EditText中輸入第一個(gè)字母要隱藏hint的時(shí)候,TextInputLayout中會(huì)出現(xiàn)一個(gè)懸浮的標(biāo)簽來(lái)顯示這個(gè)hint,還負(fù)責(zé)一個(gè)炫酷的的material 動(dòng)畫 SnackBar:SnackBar是DesignSupportLibrary中的一個(gè)重要的控件,用于在界面下面提示一些關(guān)鍵信息,跟Toast不同的地方是SnackBar允許用戶向右滑動(dòng)消除它,同時(shí),也允許在SnackBar中設(shè)定一個(gè)Action,當(dāng)用戶點(diǎn)擊了SnackBar里面的按鈕的時(shí)候,可以進(jìn)行一些操作,所以,功能絕對(duì)是很強(qiáng)大的。CardView:◆ 注意不同 SDK 版本(低于 Lollipop 21)上的邊距(Margin)效果Google 在 Android Lollipop 中引入了 Material Design 設(shè)計(jì)中的陰影(Elevation)和 Z 軸位移,其目的就是突出界面中不同元素之間的層次關(guān)系。為了統(tǒng)一不同系統(tǒng)版本的視覺效果,Google 針對(duì) SDK 21 以下的系統(tǒng)給 CardView 加入一個(gè) Elevation 兼容(即 XML 中的 app:cardElevation 和 Java 代碼中的 setCardElevation)。然而,在低版本中設(shè)置了 CardElevation 之后 CardView 會(huì)自動(dòng)留出空間供陰影顯示,而 Lollipop 之后則需要手動(dòng)設(shè)置 Margin 邊距來(lái)預(yù)留空間,導(dǎo)致我在設(shè)置 Margin 在 Android 5.x 機(jī)器上調(diào)試好后,在 Kitkat 機(jī)器調(diào)試時(shí)發(fā)現(xiàn)邊距非常大,嚴(yán)重地浪費(fèi)了屏幕控件。因此,我們需要自定義一個(gè) dimen 作為 CardView 的 Margin 值:創(chuàng)建 /res/value 和 /res/value-v21 資源文件夾于項(xiàng)目對(duì)應(yīng) Module 目錄下,前者放置舊版本/通用的資源文件(了解的可以跳過(guò)),后者放置 21 及更高 SDK 版本的資源文件。在 value 內(nèi)的 dimen.xml 創(chuàng)建一個(gè) Dimension (屬性),隨便命個(gè)名(如 xxx_card_margin)并填入數(shù)值 0dp。
接著在 value-v21 文件夾內(nèi)的 dimen.xml 創(chuàng)建名字相同的 Dimension,并填入你期望的預(yù)留邊距(一般和 CardElevation 陰影大小相同)
最后,在你布局中的 CardView 中設(shè)置 android:layout_margin="@dimen/xxx_card_margin"
這樣依賴就解決了低版本中邊距過(guò)大或者視覺效果不統(tǒng)一的問題了。
◆ 為你的 Card 添加點(diǎn)擊效果
當(dāng)使用 CardView 的場(chǎng)合是作為列表中的一個(gè) Item 且直接單擊 Item 有相應(yīng)的操作,那么就有必要加上視覺反饋來(lái)告訴用戶這個(gè) Card 是可點(diǎn)擊的。