作家
登录

Android面试17个知识点总结宝典

作者: 来源: 2017-12-11 09:06:58 阅读 我要评论

    3. 应用eventbus进行通信,这种办法及时性高,并且Activity与Fragment之间可以完全解耦。

  1. //Activity中的代码 
  2.  
  3. EventBus.getDefault().post("消息");  
  4.  
  5. //Fragment中的代码 
  6.  
  7. EventBus.getDefault().register(this); 
  8.  
  9. @Subscribe 
  10.  
  11. public void test(String text) { 
  12.  
  13.     tv_test.setText(text); 
  14.  

ANR

5、Service

Service分为两种:

  1. 本地办事,属于同一个应用法度榜样,经由过程startService来启动或者经由过程bindService来绑定并且获代替劳对象。如不雅只是想开个办事在后台运行的话,直接startService即可,如不雅须要互相之间进行传值或者操作的话,就应当经由过程bindService。
  2. 长途办事(不合应用法度榜样之间),经由过程bindService来绑定并且获代替劳对象。

Android的视图树

  1. context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()  
  2.  
  3. context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()  

留意

Service默认是运行在main线程的,是以Service中如不雅须要履行耗时操作(大年夜文件的操作,数据库的拷贝,收集请求,文件下载等)的话应当在子线程中完成。

!间谍作况是:Service在清单文件中指定了在其他过程中运行。

如上图所示,我们可以把全部消息机制看作是一条流水线。个中:

  1. MessageQueue是传送带,负责Message队列的传送与治理
  2. Looper是流水线的发念头,赓续地把消息大年夜消息队列琅绫擎掏出来,交给Handler来处理
  3. Message是每一件产品
  4. Handler就是工人。然则这么比方不太恰当,因为发送以及最终处理Message的都是Handler

6、Android中的消息传递机制

为什么要应用Handler?

因为屏幕的刷新频率是60Hz,大年夜概16毫秒会刷新一次,所认为了包管UI的流畅性,耗时操作须要在子线程中处理,子线程不克不及直接对UI进行更新操作。是以须要Handler在子线程发消息给主线程来更新UI。

这里再深刻一点,Android中的UI控件不是线程安然的,是以在多线程并发拜访UI的时刻会导致UI控件处于弗成预期的状况。Google不经由过程锁的机制来处理这个问题是因为:

  1. 惹人锁会导致UI的操作变得复杂
  2. 惹人锁会导致UI的运行效力降低

是以,Google的工程师最后是经由过程单线程的模型来操作UI,开辟者只须要经由过程Handler在不合线程之间切花就可以了。

概述一下Android中的消息机制?

Android中的消息机制主如果指Handler的运行机制。Handler是进行线程切换的关键,在主线程和子线程之间切换只是一种比较特别的应用情景罢了。个中消息传递机制须要懂得的器械有Message、Handler、Looper、Looper琅绫擎的MessageQueue对象。

为什么在子线程中创建Handler会抛异常?

Handler的工作是依附于Looper的,而Looper(与消息队列)又是属于某一个线程(ThreadLocal是线程内部的数据存储类,经由过程它可以在指定线程中存储数据,其他线程则无法获取到),其他线程不克不及拜访。是以Handler就是借居跟线程是绑定在一路了。是以要应用Handler必须要包管Handler所创建的线程中有Looper对象并且启动轮回。因为子线程中默认是没有Looper的,所以会报错。

精确的应用办法是:

  1. handler = null
  2.     new Thread(new Runnable() { 
  3.  
  4.         private Looper mLooper; 
  5.  
  6.         @Override 
  7.         public void run() { 
  8.             //必须调用Looper的

      推荐阅读

      Github年度报告盘点:TensorFlow无疑是最大赢家!

    开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 以前十年,Github所有开辟者共享2500万公共仓库的代码,用户遍布200多个国度,应用人数达到了2400万,有6700万Repo,新增了10亿提>>>详细阅读


    本文标题:Android面试17个知识点总结宝典

    地址:http://www.17bianji.com/lsqh/39609.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)