Android 看完这些“面试”无压力

最近一直在看一本书《Android开发艺术探究》,我本是一个不喜欢看书的人,听说这本书不错的,就看了一遍 ,一方面补充一下遗漏的知识,另一方面温习一下Android,讲的确实很好 ,很全。在看书的过程中我就把一些,自己不会的,模糊,面试常问的问题总结了一下。以便以后忘记了,还能拿出来 看看。

这些都是个人从书中的理解总结的,有些是不全的,大家可以拿着 “问题” 去搜索

首先把问题大纲列出来:

1.Activity 的相关知识

2.事件分发

3.view的滑动冲突

4.view的工作流程

5.Android动画分析

6.Android网络通信

   7.Android多线程操作

8.支付宝SDK使用流程

    9.Android的线程和线程池

    10.Android消息机制handler工作原理

    11.Android性能优化

1.Activity 的相关知识


第一个问题:Activity 关于onsaveinstancestate()和onrestoreinstancestate()的了解?
说实话我以前对这两个方法了解的并不多,因为开发中基本没用过。这两个方法只会在activity 界面异常的情况下调用。onsaveinstancestate()中保存数据,onrestoreinstancestate()中获取数据当然在oncreat()中也能获取到onsaveinstancestate对象。那这两个方法有什么不同呢,如果在oncreate()方法中用onsaveinstancestate必须判断是否为null。在onrestoreinstancestate()中不用判断。

第二个问题;Activity生命周期发生改变的问题,例如转屏,怎么防止改变?
这个问题以前做视频的全屏时遇到过,记录一下吧,如果需要防止activity 的生命周期发生改变,就要调用 configChanges,然后给他填写相应的属性:orientation|screenSize 。

2.事件分发

1.自定义view 

MotionEvent 手指事件
TouchSlop 手指最小滑动距离
VelocityTracker 在 x ,y方向的滑动速度
GestureDetector 滑动手势
Scroller 弹性滑动对象

2.动画
补间动画 fillafter 属性为false 时动画完成,view回到原始位置,设置为true 时 不会回到原始位置。


3.view 事件的分发
1.当一个点击事件产生后,会把这个事件传递给具体的view对象,这个传递过程就是事件分发。
2.
dispatchTouchEvent  --  主要是判断是否消耗 事件
onIntercepterTouchEvent  --   截取事件(view没有该方法)
onTouchEvent  -- 真正消耗事件的地方
3.
事件传递过程:
事件首次都会经过 activity   ---》  Window  --》 顶级的view  然后就是事件分发
4.onTouchListerner()和 onTouchevent()方法的区别
首先:onTouchevent()方法是重写activity 的方法,当手指触摸屏幕时触发
其次:ontouchlistener()是 view 设置的监听方法。

3.view的滑动冲突
事件冲突:
1.
滚动的时候产生冲突具体例子有 内部可滚动同时外部也能滚动的时候:处理方法 外部拦截和内部拦截两种。
2.
外部拦截就要重写 父view的 onintercepterTouchevent 方法 在里面做临界条件判断是否需要拦截。
内部拦截就是子view中调用 parent.requestDisallowInterceptTouchEvent(false) //返回false就是父类需要拦截

4.view的工作流程

view 的三大流程:测量流程onmeasure(),布局流程onlayout(),绘制流程ondraw()。

5.Android动画分析

1.

Android动画分为:帧动画,补间动画,属性动画。

帧动画:播放一组图片达到动画效果。

补间动画:通过 旋转,缩放,平移等效果动画

属性动画:高级动画,在api11 之后出生,所以需要用兼容库

2.补间动画

TransleAnimation 平移动画

ScaleAnimation   缩放动画

RotateAnimation  旋转动画

AlphaAnimation   透明渐变动画

AnimationSet  动画集合

3.view动画特殊使用场景

1LayoutAnimation是给Viewgroup的子view增加动画效果。让每个出场的自view都具有动画。例如:listview

2LayoutAnimation使用方法:

     1.res/anim/name.xml文件下

         2.使用:

<LayoutAnimation

xmlns:android=”htttp://````----------.android”

android:delay=”0.5”   //根据周期300ms来计算延迟多久入场

android:animationOrder=”normal”

android:animation=”@anim/xxx.xml”

/>

4.属性动画

  1. 属性动画不只是能够作用在view上,能作用在任何对象上即使,没有对象。

ValueAnimator

ObjectAnimator

AnimatorSet 动画集合,让一个view同时有两个动画效果。

2.属性动画的兼容性:在api 11上才出现,因此需要兼容低版本的Android手机 这时候就要 使用兼容库 nineoldandroids

ObjectAnimator ob = ObjectAnimator.ofFloat(

view, //对象

”rotationX”, //动画效果 rotationrotationY/XtranslationY/XscaleY/Xalpha

start, //开始位置

end);     //结束位置

5.ValueAnimator ObjectAnimator 的区别

ValueAnimator 不直接作用于对象上,而是修改一个值的变化过程,我们拿到这个值得变化过程来设置我们的view的属性,让我们的view的属性也有个变化的过程才会有动画效果。

ObjectAnimator 是直接作用在 对象上的。

6.动画注意的事情

1.OOM 这个问题主要出现在帧动画中。

2.内存泄漏 这个问题出现在属性动画的无限循环属性中,如果有无限循环的动画,在退出activity时 要 关闭,避免内存泄漏。

3.动画兼容性问题 在做开发时要注意兼容,比如低版本的手机要采用 nineoldandroids兼容库。

4.使用动画时建议开启硬件加速,增加动画的流畅度。

6.Android网络通信 

1.Android网络通信提供了三种接口:

   01.java接口:客户端secket套接字,服务端serverSecket

   02.apache接口:HttpClient 接口。

03.Android接口 :HttpURLConnection

现在基本都是用第三方请求框架:xutils3.0okhttprxjava+rotifite框架组合。

7.Android多线程操作

1.进程和线程介绍

 对于Android来说 进程就相当于整个应用程序app,线程就是Android的主UI线程。

2.多线程开发的原因

 因为Android所有处理都是在一个主线程中包括UI更新,界面展示,这时候如果遇到耗时的操作时,主线程就会被阻塞。就会产生ANR线程(应用程序无响应),这时候我们就需要把耗时的操作放到子线程中去处理。

3.异步操作

AsyncTask 

4.注意

  我们在开子线程处理耗时操作时一定要注意空指针异常,为什么在开子线程的时候会有空指针异常,因为当我们开启子线程的时候主线程也在工作。就是当主线程和子线程同时工作时。如果主线程需要子线程中返回的参数时,这时子线程还没有结束,参数还没有返回。所以这时就会空指针异常。


8.支付宝SDK使用流程

9.Android的线程和线程池

1.线程

(1)Android中的线程分为主线程和子线程,主线程主要处理UI的更新,子线程是处理一些耗时的操作,避免发生ANR现象。

(2)因为UI更新是在主线程中,UI又是直接与用户交互,因此主线程中就不能放耗时的操作,以防UI产生卡顿现象。用户体验不好。

(3)AsyncTask异步任务基于线程池,handlerThreadIntentService

2.线程池ThreadPoolExecutor

10.Android消息机制handler工作原理

1.Android handler消息机制用于线程间通信(主要表现在子线程发送消息给主线程提醒UI的更新)。

2.Handler工作是配合MessageQueue消息队列,Looper消息循环一起工作的,他们之间的关系是:handler对象通过post/send方法发送消息,此消息就被插入到MessageQueue消息队列中,通过next方法传递给Looper,Looper 是一个死循环处理消息,当收到消息后会把此消息传递给 handler(主意:此时处理消息是在 handlerMessage()方法中处理的,通过 msg.wait判断当前是哪一个 handler对象发来的消息)去处理。

3.Looper 详解

Looper 循环的意思,主要是在线程中工作,每个线程都有一个Looper对象,如果没有Looper线程是无法工作的。

启动一个Looper 是通过:Looper.prepare();

Looper.loop();

11.Android性能优化

1.布局优化

(1)减少布局文件的层级。

(2)使用<include/>标签,增强布局的重用。

2.绘制优化

(1)ondraw()方法中不要,创建局部对象,不要大量使用for循环等耗时的操作。

(2)绘制的时候有可能会用到线程或动画控制绘制效果,这时候如果界面退出,很有可能产生内存泄漏。

3.内存泄漏优化

4.响应速度优化

5.listview优化

(1)避免在getview中处理耗时的操作。(采用异步处理)

(2)开启activity的硬件加速。

6.bitmap优化

(1)使用bitmapfactory.options 方法按比例缩小图片,加载图片的缩略图。

(2)Bitmap 使用的时候用 软引用,在内存不足的时候释放对象。

7.线程优化

(1)采用线程池,线程池可以重用内部的线程。

(2)线程池可以避免线程的频繁创建和销毁。

(3)线程池可以控制线程最大并发数

8.MAT内存泄漏检测工具






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangRain1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值