面试题集锦

作者: 菜鸟_一枚 | 来源:发表于2016-03-31 10:06 被阅读290次

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、内存泄露是什么

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。
  • 解决办法

8、什么是HTTP

  • 网络编程总结
  • HTTP(Hypertext Transfer Protocol),即超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。HTTP协议是基于TCP/IP之上的协议,它不仅保证正确传输超文本文档,还确定传输文档中的哪一部分,以及哪一部分内容首先显示(如文本先与图形)等等。

9、线程池可以做些什么

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、怎么避免内存减少

21、权重那俩为什么用height=0

22、webview

23、怎么刷新view

24、瀑布流怎么实现

相关文章

网友评论

    本文标题:面试题集锦

    本文链接:https://www.haomeiwen.com/subject/yvyelttx.html