面試題集錦

若蘭__明月發表於2017-12-27

###1、Activity,fragment的生命週期 http://blog.csdn.net/wuyinlei/article/details/49427105

###2、什麼是ANR

  • 在android上,如果你的應用程式有一段時間響應不移靈敏,系統會向使用者提示“應用程式無響應”(ANR:application Not Responding)對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者
  • 原因:
    • android應用程式通常是執行在一個單獨的執行緒(例如:main)裡,這就意味你的應用程式所做的事情如果在主執行緒裡佔用了大長時間的話,就會引發ANR對話方塊,因為你的應用程式並沒有給自己機會來處理輸入事件或者Intent廣播。
  • 如何避免:
    • 執行在主執行緒裡的任何訪求都儘可能少做事情。特別是,activity應該在它的關鍵生命週期方法(onCreate()和onResume())裡儘可能少的去作建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子執行緒裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主執行緒阻塞在那裡等待子執行緒的完成---也不是呼叫Thread.wait()或者Thread.sleep()。替代的方法是:主執行緒應該為子執行緒提供一個Handler,以便完成時能夠提交給主執行緒。以這種方式設計你的應用程式,將能保證你的主執行緒保持對輸入的響應性並能避免由5秒輸入事件的超時引發的ANR對話方塊。這種做法應該在其它顯示UI的執行緒裡效仿,因為它們都受相同的超時影響。 ###3、AIDL是什麼
  • aidl是 Android Interface definition language的縮寫,一看就明白,它是一種android內部程式通訊介面的描述語言,通過它我們可以定義程式間的通訊介面 icp:interprocess communication :內部程式通訊。 ###4、ListView是怎麼實現 ###5、都有一些什麼佈局
  • FrameLayout
  • RelativeLayout
  • LinearLayout
  • TableLayout
  • AbsoultLayout ###6、記憶體洩露是什麼
  • http://www.cnblogs.com/lbeing/archive/2010/09/29/1838858.html ###7、圖片的三級快取,簡述OOM,以及解決辦法
  • http://blog.csdn.net/wuyinlei/article/details/50606455
  • 什麼是OOM
    • 記憶體溢位 怎麼解決OOM,通常OOM都發生在需要用到大量記憶體的情況下(建立或解析Bitmap,分配特大的陣列等),在這樣的一種情況下,就可能出現OOM,據我現在瞭解到,多數OOM都是因為Bitmap太大。所以,這裡我就專門針對如何解決Bitmap的OOM。其實最核發的就是隻載入可見範圍內的Bitmap,試想這樣一種情況,在GridView或ListView中,資料量有5000,每一屏只顯示20個元素,那麼不可見的,我們是不需要儲存Bitmap在內在中的。所以我們就是隻把那麼可見的Bitmap保留在記憶體中,那些不可見的,就釋放掉。當元素滑出來時,再去載入Bitmap。
  • 解決辦法
    • http://blog.csdn.net/wuyinlei/article/details/50960215 ###8、什麼是HTTP
  • 網路程式設計總結
    • http://blog.csdn.net/wuyinlei/article/details/50930361
  • HTTP(Hypertext Transfer Protocol),即超文字傳輸協議。是WWW瀏覽器和WWW伺服器之間的應用層通訊協議。HTTP協議是基於TCP/IP之上的協議,它不僅保證正確傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪一部分內容首先顯示(如文字先與圖形)等等。 ###9、執行緒池可以做些什麼
  • http://www.ibm.com/developerworks/cn/java/j-jtp0730/ ###10、ListView優化
  • 第一:
    • 重用了convertView,很大程度上的減少了記憶體的消耗。通過判斷convertView是否為null,是的話就需要產生一個檢視出來,然後給這個檢視資料,最後將這個檢視返回給底層,呈獻給使用者。
ViewCode 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
    { 
if(convertView==null) 
{ 
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
} 
TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
ContactInfo1confo=contacts.get(position); 
if(confo!=null){//toseteveryitem'stext 
tv_name.setText(confo.getContactName()); 
tv_phone.setText(confo.getContact_Phone()); 
} 
returnconvertView; 
}
複製程式碼
  • 第二:
    • 上面的寫法會有一個缺點,就是每次在getVIew的時候,都需要重新的findViewById,重新找到控制元件,然後進行控制元件的賦值以及事件相應設定。這樣其實在做重複的事情,因為的geiview中,其實包含有這些控制元件,而且這些控制元件的id還都是一樣的,也就是其實只要在view中findViewById一次,後面無需要每次都要findViewById了。
    • 下面給出第二種寫法 寫發的特點,通常有一個內部類classViewHolder,這個ViewHolder,用來標識view中一些控制元件,方便進行一些事件相應操作的設定,比如onClick等等,這樣可以不用每次都要findViewById了,減少了效能的消耗。同時重用了convertView,很大程度上的減少了記憶體的消耗。
ViewCode 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
ViewHolderholder; 
if(convertView==null){ 
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
holder=newViewHolder(); 
holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
convertView.setTag(holder); 
} 
else 
{ 
holder=(ViewHolder)convertView.getTag(); 
} 
ContactInfo1confo=contacts.get(position); 
Log.i("my","confo"+confo.getContactName()); 
if(confo!=null){//toseteveryitem'stext

holder.tv_name.setText(confo.getContactName()); 
holder.tv_phone.setText(confo.getContact_Phone()); 
} 
returnconvertView; 
} 
classViewHolder 
{ 
TextViewtv_name,tv_phone; 
}
複製程式碼
  • 第三:
    • 個人覺得這個寫法是最舒服的,最舒服的意思是看著程式碼有一種很爽,看的很清晰。 特點,使用了內部類classViewHolder、重用了convertView。 區別第二種寫法是,使用了一個臨時變數Viewview=convertView,然後修改view,最後返回view 特點:如果當前的convertView為null,則通過LayoutInflat產生一個view。
ViewCode 
@Override 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
Viewview=convertView; 
ViewHolderholder; 
if(view==null){ 
view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
holder=newViewHolder(); 
holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); 
holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
view.setTag(holder); 
} 
else 
{ 
holder=(ViewHolder)view.getTag(); 
} 
ContactInfo1confo=contacts.get(position); 
Log.i("my","confo"+confo.getContactName()); 
if(confo!=null){//toseteveryitem'stext

holder.tv_name.setText(confo.getContactName()); 
holder.tv_phone.setText(confo.getContact_Phone()); 
} 
returnview; 
} 
classViewHolder 
{ 
TextViewtv_name,tv_phone; 
}
複製程式碼

###11、Fragment用的多不多,怎麼和activity傳值

  • bundle
  • intent
  • 定義回撥介面
  • eventbus等第三方
  • 聯絡
    • 1、可以互相互動,傳遞引數和資訊
    • 2、建立方法回撥,activity和fragment共享事件
  • 區別
    • 1、都有各自的獨立的生命週期
    • 2、效能上fragment要佔有一定的優勢
    • 3、要依附於activity存在 ###12、說說單例模式
  • 單例模式實現的兩種方式 ###13、一個APP存在一些BUG,如果不通過使用者反饋,如何收集bug資訊 ###14、用過什麼框架
  • 圖片載入框架4個
  • 網路請求框架3個
  • EventBus事件分發、圖片輪播 ###15、懶載入 ###16、執行緒池怎麼用 ###17、大圖片載入
  • 怎麼避免圖片載入的時候出現OOM
    • 圖片壓縮,圖片快取,圖片不見時候釋放記憶體,滑動的時候不載入(不請求網路)
      ###18、輪播圖
  • 程式碼家的ImageSliding ###19、圖片快取節省流量 ###20、怎麼避免記憶體減少
  • 記憶體優化技巧http://blog.csdn.net/wuyinlei/article/details/50960215 ###21、權重那倆為什麼用height=0 ###22、webview ###23、怎麼重新整理view
  • http://blog.csdn.net/zhanglongit/article/details/42459199 ###24、瀑布流怎麼實現
  • http://blog.csdn.net/mcy478643968/article/details/8435612
  • http://www.cnblogs.com/youxilua/archive/2012/09/21/2696941.html
  • http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0919/1696.html

相關文章