• Android面试总结经


        自上周怒辞职以后,就開始苦逼的各种面试生涯,生活全然靠私活来接济,时有时没有,真难。还能快乐的玩耍吗。最多一天面试了5家,哎感觉都是不急招人,各种等待通知。好不easy等来一家。还克扣了薪资,从我要的12k到他们给8k,感觉累觉不爱。

         面试都是基本过了二面的,大到腾讯,阿里。百度。网易,小到15人的创业公司我都去了,难得今天歇息一下。总结以下试经验。以便下次面试用到。技术题目我就不说了,这是基础。不会的还是把基础看下吧。后面的题目都是让人蛋疼的机制问题。

        1、什么是线程。线程和进程的差别,线程的工作原理

     线程就是程序运行流中最小单元。是系统独立调度的基本单位,线程不具有不论什么系统资源。这里须要特别注意,

    就象程序一样,线程有生命周期:它们启动、运行,然后完毕。一个程序或进程或许包括多个线程。而这些线程看来互相单独地运行。

    线程是通过实例化Thread对象或实例化继承Thread的对象来创建的。但在对新的Thread对象调用start()方法之前,这个线程并没有開始执行。当线程执行到其run()方法的末尾或抛出未经处理的异常时,它们就结束了。

    sleep()方法能够用于等待一段特定时间;而join()方法可能用于等到还有一个线程完毕。

    线程的一些基本方法:

    isAlive():推断线程是否还"活"着
       getPriority():
    获得线程的优先级数值
       setPriority():
    设置线程的优先级数值
       Thread.sleep():
    将当前线程睡眠指定毫秒数
       join():
    调用某线程的该方法,将当前线程与该线程"合并",即等待该线程结束,再恢复当前线程的执行
       yield():
    让出cpu,当前线程进入就绪队列等待调度
       wait():
    当前线程进入对象的wait pool
       notify()/notifyAll():
    唤醒对象的wait pool中的一个/全部等待线程

    特别注意sleep和wait的差别:

    Wait是Object类的方法,范围是使该Object实例所处的线程。

    Sleep()是Thread类专属的静态方法,针对一个特定的线程。

    Wait方法使实体所处线程暂停执行,从而使对象进入等待状态,直到被notify方法通知或者wait的等待的时间到。Sleep方法使持有的线程暂停执行。从而使线程进入休眠状态。直到用interrupt方法来打断他的休眠或者sleep的休眠的时间到。

    线程和进程的差别:

    (1)地址空间:进程内的一个运行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

    (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

    (3)线程是处理器调度的基本单位,但进程不是.

     

    多线程

    很多线程在运行中必须考虑与其它线程之间共享数据或协调运行状态。这就须要同步机制。

    在Java中每一个对象都有一把锁与之相应。

    synchronized语句计算一个对象引用,试图对该对象完毕锁操作, 而且在完毕锁操作前停止处理。当锁操作完毕synchronized语句体得到运行。当语句体运行完毕(不管正常或异常),解锁操作自己主动完毕。

    作为面向对象的语言,synchronized常常与方法连用。一种比較好的办法是,假设某个变量由一个线程赋值并由别的线程引用或赋值,那么全部对该变量的訪问都必须在某个synchromized语句或synchronized方法内。

    2、怎样去理解handlermessagemessagequeenlooper,一个message是否有几个looper,你写过looper没有。

    1、MessageQueue:是一种数据结构,见名知义。就是一个消息队列,存放消息的地方。每个线程最多仅仅能够拥有一个MessageQueue数据结构。创建一个线程的时候,并不会自己主动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。

    主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建。将自己主动创建一个Message Queue。

    其它非主线程。不会自己主动创建Looper,要须要的时候,通过调用prepare函数来实现。

    2、Message:消息对象,Message Queue中的存放的对象。

    一个Message Queue中包括多个Message。Message实例对象的取得。通常使用Message类里的静态方法obtain(),该方法有多个重载版本号可供选择;它的创建并不一定是直接创建一个新的实例,而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。

    假设Message Pool中没有可用的Message实例,则才用给定的參数创建一个Message对象。

    调用removeMessages()时,将Message从Message Queue中删除,同一时候放入到Message Pool中。

    除了上面这样的方式,也能够通过Handler对象的obtainMessage()获取一个Message实例。

    3、Looper

    是MessageQueue的管理者。每个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。

    同一时候每个Looper对象和一个线程关联。通过调用Looper.myLooper()能够获得当前线程的Looper对象创建一个Looper对象时。会同一时候创建一个MessageQueue对象。除了主线程有默认的Looper。其它线程默认是没有MessageQueue对象的,所以,不能接受Message。如须要接受。自定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。

    处理完毕后,调用Message.recycle()将其放入Message Pool中。

    4、Handler

    消息的处理者,handler负责将须要传递的信息封装成Message。通过调用handler对象的obtainMessage()来实现。将消息传递给Looper,这是通过handler对象的sendMessage()来实现的。继而由Looper将Message放入MessageQueue中。

    当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler对象收到该消息后,调用对应的handler对象的handleMessage()方法对其进行处理。

    3子线程和UI线程的差别,子线程的工作原理。怎样更改UI

             这个比較简单一些,了解了上面的内容就知道子线程发送message,通过handler的handleMessage方法去获取message然后更新UI。

    4遇到过OOM没有,举个你优化OOM的样例,

             Oom是指内存溢出,普通情况是图片过大造成的。

    解决方式:

    (1)缓存图像到内存,採用软引用缓存到内存,而不是在每次使用的时候都从新载入到内存。

    (2)调整图像大小。手机屏幕尺寸有限,分配给图像的显示区域本身就更小,有时图像大小能够做适当调整;

    (3)採用低内存占用量的编码方式。比方Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;

    (4)及时回收图像,假设引用了大量Bitmap对象。而应用又不须要同一时候显示全部图片,能够将临时用不到的Bitmap对象及时回收掉。

    (5)自己定义堆内存分配大小,优化Dalvik虚拟机的堆内存分配。

    5GC的工作原理

             Garbage Collection简称为GC,是垃圾回收的意思、内存处理器是编程人员easy出现故障的地方。忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃。Java语言提供的GC功能能够自己主动的检測对象是否超过作用域。从而达到自己主动回收内存的目的,java语言没有提供释放已分配内存的显示操作方法,资源回收工作所有交由GC来完毕。程序猿不能精确的控制垃圾回收的时机。

    GC在实现垃圾回收时的基本原理:

    Java的内存管理实际就是对象的管理。当中包含对像的分配和释放。对于程序猿来说。分配对象使用newkeyword,释放对象时仅仅是将对象赋值为null,让程序猿不可以再訪问到这个对象,该对象被称为“不可达”。

    GC将负责回收全部“不可达”对象的内存空间。

    对于GC来说,当程序猿创建对象时,GC就開始监控这个对象地址、大小以及使用情况。通常GC採用有向图的方式记录并管理堆中的全部对象,通过这样的方式确定哪些对象是“可达”的,哪些对象是“不可达”的。当GC确定一些对象为“不可达时”GC就有责任回收这些内存空间,但为了GC可以在不同的平台上实现,java规范对GC的非常多行为都没有进行严格的规定。比如对于採用什么类型的回收算法、什么时候进行回收等重要问题都没有明白的规定,因此不同的JVM实现着不同的的实现算法。这也给JAVA程序猿的开发带来了非常多不确定性。

    依据GC的工作原理,能够通过一些技巧和方式让GC执行更快,高效而又合理。编程建议例如以下:

    1、尽早释放无用对象的引用,特别注意一些复杂对象,如数组。队列等。

    对于此类对象,GC回收它们的效率一般较低,假设程序同意,应尽早将不用的引用对象赋为null,这样能够加速GC的工作。

    2、尽量少用finalize函数。

    finalize是java提供给程序猿用来释放对象或资源的函数,可是它会加大GC的工作量,因此尽量少採用finalize函数回收资源。

    6说下你的IPC通信的理解

    Android系统中大量使用了基于C/S模式的通信方式。诸如短信操作,电话操作,视频音频捕获,传感器等都以服务(Service)的形式提供,并由对应的Server负责管理,应用程序作为Client仅仅须要与这些Server建立连接并发送请求便能使用这些服务。因此,开发人员全然不必关心Service的实现细节,直接与Server建立连接然后使用其提供的接口就可以。

    Client和Server通常是执行在不同的进程中的。这就涉及到进程间通信(IPC,Inter-ProcessCommunication)。为了保证系统安全性。提高通信效率以及提供对C/S模式的支持,Android採用了一种基于共享内存的IPC机制——Binder机制。

    详细的实现方法就是AIDL,这属于技术方面了。不懂的能够百度。

    7httptcp通信的你做过什么项目

             http重点是url和httpclient。

    状态码为1这一类型的状态码。代表请求已被接受。须要继续处理。这类响应是暂时响应,仅仅包括状态行和某些可选的响应头信息。并以空行结束。

             状态码为2这一类型的状态码,代表请求已成功被server接收、理解、并接受。

             状态码为3这类状态码代表须要client採取进一步的操作才干完毕请求。

    通常,这些状态码用来重定向,兴许的请求地址(重定向目标)在本次响应的 Location 域中指明。

             状态码为4为错误码

             状态码为5server错误

             TCP重点就是sokect。

    8复写过view吗?viewgourp里面有些什么方法?

             自己定义view重要的是复写ondraw方法。

             View是继承viewgroup的,所以复写viewgroup能实现我们想要一切东西,viewgroup基本的方法:

             Onlayout()方法负责把该view放在參数指定位置。

             onMeasure()方法不但能够为ViewGroup指定大小。还能够通过遍历为每个子View指定大小。在自己定义ViewGroup中加入上面代码为ViewGroup中的每个子View分配了显示的宽高。

             onDraw重绘view

             


  • 相关阅读:
    部署方法
    MIME
    设置下载文件位置
    访问端口
    什么是Linq表达式?什么是Lambda表达式?
    彻底理解js中this的指向,不必硬背。
    获取checkbox状态
    checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发
    leetcode — reverse-nodes-in-k-group
    leetcode — swap-nodes-in-pairs
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6734764.html
Copyright © 2020-2023  润新知