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

         


转载于:https://www.cnblogs.com/cxchanpin/p/6734764.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成step文件_利用opencv给彦女王生成一副蒙太奇画像

大家好呀,前两天烈阳天道1上映了,不知道大家看没看呢,里面还有一小段彦穿越虫洞与猴哥相遇的画面,彦女王啊啊啊~~所以我去网上爬了二百来张我大学的风景画,然后找了以前存的彦女王的图片,生成了一幅蒙太奇画…

浪漫情人节|C语言画心型

1.前言新年第一天上班,先祝大家新年快乐,巧的是,今天刚好又是情人节,所以想了下用C实现画心形符号~过年的时候,跟我表哥去接新娘,实地看了下,如果一个汉字内心没有点浪漫的细胞,很难…

CS190.1x Scalable Machine Learning

这门课是CS100.1x的后续课,看课程名字就知道这门课主要讲机器学习。难度也会比上一门课大一点。如果你对这门课感兴趣,可以看看我这篇博客,如果对PySpark感兴趣,可以看我分析作业的博客。 Course Software Setup 这门课的环境配置…

嵩天python爬虫_我自己爬-python爬虫快速入门(一)

request库对于轻量级用户,像我一样只是准备写一个搞笑用的程序,requests是很方便的存在。安装通过pip就不说了request的几个主要方法requests.request() 构造一个请求,支撑以下各方法的基础方法requests.get() 获取HTML网页的主要方法&#x…

Linux_ACL_su

ACL ACL: 针对单一使用者, 文件, 目录进行rwx权限规范(当传统的Linux权限无法满足时采用) 1.ACL设置技巧: getfacl(取得ACL设置目录), setfacl(设置ACL规范) setfcal [-bkRd] [{-m | -x} acl 参数] 目标文件 m: 设置后续的acl参数给文件使用 x: 删除后续的acl参数 b: 移除…

./4.sh: No such file or directory

sh push到目标板后提示出错 #!/bin/bash echo "ladjfaosdjfoia"头bin/bash 我们要看,sh在哪里 130|rk3399_idpad:/data # which sh /system/bin/sh rk3399_idpad:/data # 所以上面的代码应该写成 #!/system/bin/sh echo "ladjfaosdjfoia"修…

Spring总结四:IOC和DI 注解方式

首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式更为简便。 IOC获取对象注…

和后台如何对接_业务系统如何对接第三方服务?

在产品工作中,我们时常要对接第三方服务。本文作者从过往的对接项目经历中,提炼的关于业务系统,如何对接第三方服务的方法论,希望能对你有所帮助。随着公司业务的发展,我们有时会遇到,需要在自身业务系统中…

adb 启动某个apk

有时候需要用apk来启动某个apk adb shell am start -n com.android.launcher3/com.android.launcher3.Launcher 具体查看~ /rk3399_7in1/packages/apps/Launcher3/AndroidManifest.xml

Linux_PAM_用户之间的信息传递

PAM 账户信息的验证,可动态加载验证模块,提高验证的灵活性; PAM是一套应用程序接口,提供一连串的验证机制,借由一个与指令程序相同文件名的配置文件进行认证分析. 验证的过程包含三个字段: 1.验证类别(Type): author(认证):检验使用身份,需要密码进行检验account(账户):进行…

将枚举的键值绑定到下拉列表框

控制器代码: ///assemblyString:程序集名称的长格式,name:获取程序集实例中具有指定名称的 System.Type 对象,except:除了哪些枚举(键或值都可以)不加载到下拉列表框///此方法写在控…

Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?

1、obj-$ $(CONFIG_TEST) 是一个整体,$(bbb)表示引用变量 bbb 比如定义 CONFIG_TESTy $(CONFIG_TEST) 就是 y obj-$(CONFIG_TEST) 就是 obj-y 又比如定义 CONFIG_TESTm $(CONFIG_TEST) 就是 m obj-$(CONFIG_TEST) 就是 obj-m obj-y foo.o 该例子告诉Kbuild在这目…

C++_IO类型_文件输入输出流_字符串流

IO类型 iostream: 用于窗口的输入输出fstream: 用于文件读写sstream :读写存储在内存中的string对象 注:他们继承于istream与ostream,因此istream对象也可用于读取ifstream, string对象, ostream对象同上; 并且iostream类型可在同一个流实现输入输出操作;. IO对象不可复制赋…

python网络编程证书_python 网络编程——客户端

网络通信的基本接口是socket,它扩展了操作系统的基本I/O到网络网络通信。socket可以通过socket()函数来建立,通过connect()函数来连接。得到了socket,可以确定本地和远程端点的IP地址和端口号。socket对不同的协议来说都是一种通用的接口&…

AC日记——集合位置 洛谷 P1491

集合位置 思路&#xff1a; 次短路&#xff1b; 先走一遍最短路&#xff1b; 记录最短路径&#xff0c;然后依次删边走最短路&#xff1b; 最短的长度就是次短路&#xff1b; 来&#xff0c;上代码&#xff1a; #include <queue> #include <cmath> #include <cs…

Kconfig中的“depends on”和“select”

在Kconfig文件中&#xff1a; config Adepends on Bselect C它的含义是&#xff1a;CONFIG_A配置与否&#xff0c;取决于CONFIG_B是否配置。一旦CONFIG_A配置了&#xff0c;CONFIG_C也自动配置了。 参考资料&#xff1a;“select” vs “depends” in kernel Kconfig。 所以去…

C++_虚继承_虚函数_纯虚函数(多继承的二义性,多态)

基本信息 每一个类都有一个虚表,以及虚表指针; 虚表的内容是编译器决定的,虚表中用于存放虚函数的指针, 程序运行时的类型信息等; 每个多态对象都存放着一个指向当前类型的虚表的指针, 该指针在构造函数中被赋值, 一般来说当调用当前这个类的构造函数, 则虚表指针就指向当前类…

数组的合并和升序排列_leetcode 33 搜索旋转排序数组

给你一个升序排列的整数数组 nums &#xff0c;和一个整数 target 。假设按照升序排序的数组在预先未知的某个点上进行了旋转。&#xff08;例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] &#xff09;。请你在数组中搜索 target &#xff0c;如果数组中存在…

[LeetCode] [C++] 206 Reverse Linked List 反转单项链表

题目要求 Reverse a singly linked list.LeetCode 206在线测试 问题描述 给定一个单项链表&#xff0c;将其反转后返回链表头节点。 思路分析1 可以完整的遍历一遍链表&#xff0c;将链表的每个节点的值存在数组中&#xff0c;然后反向遍历数组重新生存一个新 链表。这样做需要…

defconfig、 .config

最近在裁剪内核慢慢关注这个问题 defconfig、 .config defconfig 一般在arch/arm64/configs/目录下&#xff0c;是一个简单的内核配置&#xff0c;是没有展开的。 .config一般是用来执行make menuconfig的基础配置 从.config到defcong不是简单的复制操作&#xff0c;而是mak…