第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Be an interviewer

Be an interviewer

时间:2023-10-28 19:02:27

相关推荐

Be an interviewer

在问题的最右处对问题进行等级评定,层层深入

1.Android线程之间的异步通信有哪些?(C)

handler.sendMessage AsyncTask View.post(Runnable) Activity.runOnUiThread Loaders等

1-1handler深入,looper,messageQueue是怎么合作工作的(B)

在ActivityThread启动main方法中,会去创建looper对象,并且与主线程进行绑定.一个线程只有一个looper,这个looper管理着自己的messageQueue,创建绑定完之后就进入了无限循环从messageQueue中取消息,只要应用不退出,就无限循环.接着只要我们在主线程中新建handler对象,就会跟创建该handler的线程的looper绑定(在handler的构造函数中),之后looper负责将handler send出来的message加入到queue的尾部,然后再由looper负责将message从queue的头取出(经过loop方法中的dispatchMessage进行消息分发),执行handleMessage.

1-1-1可以直接在线程中直接new一个handler出来使用么?要注意什么呢?如果不注意会报什么错误呢?(A)

在子线程中创建handler的时候一定要注意创建的时候需要同时去创建looper,否则会由于在子线程中没有绑定的looper对象而报错.报错无能直接在子线程中建立handler的错误.

1-1-2android在启动了之后为什么可以直接在activity中new一个handler进行使用呢(A)

因为在ActivityThread中系统已经帮主线程创建并且绑定好了looper,这个时候只要new一个handler,在handler的构造函数中就会自动的将handler自身与looper进行绑定

1-2asynctask是怎么使用的呢?怎么构建,方法怎么调用?三个参数传入的分别是什么呢?(C)

自定义后通过new出来对象,执行对象的excute方法实现. 常见的方法onPreExecute和onPostExecute分别在doinbackground方法前后执行,doinbackground负责在子线程中执行任务,然后将结果交由onPostExcute在主线程中处理,同时可以由onProgressUpdate来进行实时的将处理状态返回给主线程处理.定义时的三个参数,依次为传入的参数类型;第二个参数为后台处理的进度显式类型,是int还是float还是其他;第三个参数是doinbackground执行之后return给onPostExecute接受的结果类型.

1-2-1asynctask在使用的过程中哪些方法可以进行UI操作呢?(B)

直接去AsyncTask中去看有MainThread标注的都是可以在主线程中执行的

onPostExecute onProgressUpdate onPreExecute onCancelled 其实都可以讲的通

1-2-2asynctask的最高同时执行线程数,可以改么?怎么改?(A)

在3.0以前,支持并行处理,也就是说同时可以执行多个任务,当时是写死的线程池,同时可以处理的最大线程数为5个,线程池大小位128,如果同时添加超过128个AsyncTask任务,那么系统就会崩溃.3.0之后改成了串行处理,同时只能处理一个任务.其实不然,其实3.0之后变得更加灵活,可以自己去定义Executor

Executorexec=newThreadPoolExecutor(15,200,10,TimeUnit.SECONDS,newLinkedBlockingQueue<Runnable>());newDownloadTask().executeOnExecutor(exec);

传入的三个参数分别表示,可并行执行的最大的线程数,线程池大小,和超过内核数的线程最多可以存活的时间(比如我们有10个线程,内核数为4核,那么多下来的6个线程,最多可以存活如上所述的10秒)

1-2-3asynctask的弊端,(轮个数评级,A↑)

使用cancel方法时无法直接停止子线程,由于调用了cancel方法会去调用子线程的interrupt方法,但是这个方法不会直接停止子线程而是只是更改一个标志位,具体的停止操作需要用户在线程中自己做监听.所以oncancel的真正起作用的只不过是不会去调用onPostExecute

onPostExecute的时候回调出来,activity或者fragment对象已经被销毁的话就会出现找不到对象的错误.这个时候要么做空判断,要么自己定义抽象类BaseAsyncTask复写onPostExecute,并final它内存泄露,在activity的匿名内部类AsyncTask,由于AsyncTask的生命周期和activity不同步,当activity被销毁的时候,可能asynctask还在执行,那么后者持有的前者对象就会难以释放,导致内存泄露.当asynctask在执行的时候,activity由于屏幕旋转或其他原因导致重建,asyncTask由于持有的是之前的activity的引用,就会导致onPostExecute的代码不起作用.

1-3 主线程阻塞超过几秒出现ANR,数据库阻塞呢?广播接受阻塞呢?(B)

主线程5秒未响应,数据库10秒,广播10秒未相应,会出现ANR

1-4 View.post(runnable)可以执行耗时的操作么?为什么?(B)

不可以执行耗时操作,View.post出来的runnable是在UI线程中执行的.

2.平时在使用listview的时候都会注意哪些问题?(C)

图片的异步加载方面,性能优化方面(ViewHolder, convertView,滑动的时候不加载图片等)

2-1在listview中需要加载图片的话有什么比较好的方法么?(B)

采用异步加载的方式,当然可以使用第三方的图片库picasso,fresco,也可以自己实现.

2-1-1 知道怎么去写一个imageloader么?(A)

简易的imageLoader负责图片的异步加载,方法可以不止一个.

将图片的url设置为view的tag,将view传给imageloader,imageloader本身管理着一套lru缓存,将url取出后,先去缓存中查看是否有该图片,有的话直接回调显示,没有的话进行网络请求,得到结果候进行网络显示并做本地缓存.如果加载失败则显式失败的画面的.

2-1-2 有哪些第三方好用的图片库,看过源码么,可以讲一讲么,区别,推荐(A+)

picasso, fresco, glide, Universal-image-loader

如果预见项目中会有很多圆角或渐进式JPEG等需求,可以使用Fresco;

如果是老项目已经使用了UIL或者Picasso,且依赖较多不容易修改,则可以继续使用;

如果还在纠结如何避免65K方法数,推荐使用Glide代替Fresco因为Glide比后者实在轻巧了太多

如果是老项目需要换加载库,推荐使用Glide而不是Fresco, 降低迁移工作量;

如果是新项目,不推荐使用已经停止维护的UIL,也不推荐Picasso,推荐使用Glide;

2-2 如果使用过程中出现了不同的item需要展示不同的布局,这个时候用什么方法解决?(B)

使用listView的viewtype去区别不同的展示

2-3 listview怎么去和数据库做绑定呢?(B)

使用cursorAdapter去实现和数据库的绑定

2-3-1 如果想要listview对数据库做实时的更新,会怎么做呢?(A)

使用cursorLoader绑定listview,用观察者模式对数据库进行监听,一旦有变化,swapcursor,并notifyDataChanged

3. 有使用过自定义控件么,自定义控件从定义到使用,怎么个流程,可以粗略的讲一下么(B-A)

首先我们需要去attr.xml文件中去定义我们控件中需要的一些自定义的属性.然后创建我们自定义的控件继承View,主要好复写onDraw,onLayout,和onMeasure方法,以及它的构造函数.onMeasure中根据传入的宽高mode,来选择是否要对控件进行计算.如果是wrap_content的则将控件的宽高计算出来setMeasureDimensiononLayout,经过计算过后的measure宽高来获得控件的坐标点,导入onLayout最后在onDraw方法中,利用画布画笔对需要的背景或者其他内部元素进行绘制.在布局文件中,添加自定义view,与自定义命名空间,来使用该自定义控件的属性.

3-1 如果我需要为这个自定义控件创建一些特有的属性,比如说想要在布局文件中控制它的字体大小,字体颜色,应该怎么去做?(A)

在attr文件中定义自定义属性,然后在自定义控件的构造函数中通过TypeArray取出,然后对其遍历index,取出属性值,做相应处理.

3-2 除了使用动画之外,还有什么方法可以实现一个动态的view?(B)

可以使用surfaceView

3-2-1 surfaceview和一般的view有什么地方不同?(B)

一般的view都是在主线程中进行绘制的,而surfaceView是独立线程进行绘制,因此可以进行复杂的绘制,不会阻塞主线程.

3-2-2 你觉得什么情景中会使用到surfaceview,或者你知道什么地方会用到surfaceview(A)

相机模块中会使用到,或者是复杂的动画显示,或者是一些游戏界面也会食用到,只要是画面在不断的变化的就可以使用surfaceView去实现.

3-2-3 在使用surfaceview的时候需要注意一些什么?什么时候画,什么时候不画?怎么去做(A)

注意启动和关闭绘制.由于它的特殊性,我们可以在onResume中启动绘制,在onPause中停止绘制.

由于自定义的surfaceView需要去实现runnable,在类内部实现其run方法,我们可以设置一个标志位,在run方法中进行循环判断,一旦标志位为false就停止绘制,然后可以在view的onPause和onResume中修改标志位.

4.有没有NDK编程经验,或者说对NDK有了解么?(C)

结合C或C++,进行android编程,一般使用比较多的是方法封装,编译成so库文件,供android项目使用.

4-1 讲一下NDK的一个大体流程,或者说现在给你一个工具类,如何去调用C代码的一些方法?(B)

首先需要使用NDK生成相应的头文件,或者是自己写也行.然后新建.c文件,引用该头文件,然后注意定义的与java交接的方法名需要与调用该方法的类的包名相同,要遵循相应的规则.

然后在c文件中,实现该方法.之后在gradle中对其进行配置.执行NDK编译,在build目录下得到相应文件夹的so文件,将so文件放入jniLib中.在工具类中静态加载so库,然后调用相应方法即可生效.

4-1-1 eclipse上的NDK编程和studio上的有什么不同?(A)

eclipse上需要通过Android.mk和application.mk去对该NDK项目进行配置,而在studio上直接在gradle中进行配置即可.

5. 对当今比较流行的框架有了解么?可以举出你知道的一些框架么?(B)

网络框架 retrofit,Okhttp,volly等 缓存DIskLruCache等 数据库OrmLite,GreenDao等, 依赖注入Dagger2 butterKnife等 事件总线 eventBus等 RX响应式编程 内存泄露LeakCanary等等有很多

5-1 看过框架的源码么?讲一下框架大概原理,是怎么工作的?(A↑)

看具体回答评级

5-2 知道RN,听说过热修复么?动态加载,插件化知道多少?(A↑)

reactive-native利用js, html, css重新定义一套规则, 编写原生的ios,android移动应用.

hotfix,利用动态加载技术,在用户手机崩溃时,调用远程服务端的可执行文件,待远程将问题解决了之后,现场修复,替换掉有问题的坑,再让手机执行修复后的本地文件,避免了频繁的版本更新.比较热门方案的有AndFix, DexPosed, ClassLoader.热门的实现有Nuwa,HotFix,DroidFix.

而动态加载和插件化开发可以方便大规模团队协同开发, 技术也应用于热补丁修复,将项目开发模块化分散.

内容比较多,上面也只是个大概,具体看怎么去回答,根据回答的详细情况,了解情况来进行评级.

6.对整个手机的布局有了解么?画一下整个的手机布局框架(B)

观察是否有phoneWindow和decorView的概念

6-1 Activity,View,Window的关系是什么?(B)

我们在activity的attach方法中,会去生成window,就是整个手机的最根的布局,而这个window的实现类是phoneWindow,在phoneWindow中有一个最顶层的视图DecorView, 由phoneWIndow将布局文件进行解析,然后将相应的view加载到DecorVIew中.

6-1-1 setcontentView到底是怎么样把布局文件让手机屏幕展示出来的(A)

phoneWindow得setContentView方法来将activity的setContentView的布局文件加载到视图中去,这就是这三者的关系。实际上直接看setContentView的源码实现就知道它调用了getWindow().setContentView()再点开发现是空实现,因为真正的实现就在phoneWindow中。

7. 四个lunchmode(C)

standard,singleTop,singleTask,singleInstance

7-1 分别介绍一下使用场景(B)

singleTop 直接吊起activity栈的最顶部activity。 点击通知推送需要进入到一个界面,那么如果收到多个推送的话,停留在这个界面去点击这个推送就不用再去重新生成这个界面activity。

singleTask 启动activity栈中的该activity,并把其上的所有activity清空。 一般用在程序的入口,比如从好几个应用启动了浏览器,只会启动浏览器的主界面一次,浏览器主界面之后的activity都会清空掉。

singleInstance 特地为个别activity单独建立一个activity的栈,多次重复利用。 某个应用中用到了google地图,当退出该应用再次进入google地图的时候,还是停留在刚才的画面。* *

7-2 使用singleTask时候会遇到什么问题么?(A↑)比如用startActivityForResult去调用singleTask的activity会出现什么现象呢?(A)

启动singleTask和singleInstance这两类模式的activity的时候,需要注意不要去用startActivityForResult方法调用,回立马收到cancel的回调.

7-2-1 那么singleInstance呢?(A)

7-2-2 如果A真的想要用startActivityForResult去启动singleTask的B的话怎么办?(A)

直接在B中再将需要回传的数据通过startActivty(A)的方式去启动A.

8. 大体讲一下触摸事件分发吧(B↑)

隧道式的分发,冒泡式的反馈,一路直接到可以处理触摸事件的view,然后一路向上按照分发下来的路径反向反馈。

最外层的布局调它的dispatchTouchEvent方法,在方法中会去看能否拦截,如果可以且需要拦截那就拦截不往下传递,否则的话遍历找到符合条件的子view去调用它的dispatchTouchEvent,知道最终消费处理这个点击事件的子view的dispatch方法返回true,然后就不往下传递,并往上走出这个递归,这就是viewGroup和view之间的事件分发机制,结合view自己的分发就可以完美解答这个问题。

8-1 intercept返回true,false分别表示什么意思?dispatchTouchEvent呢?onTouchEvent呢?(B)

intercept返回true表示拦截了,onTouch返回true表示被我监听器消耗了,onTouchEvent表示被我view自己吃了,然后dispatchTouchEvent表示被我这个view处理消耗了。总的来说就是返回true代表不往下继续传递,开始往上传递了.

8-2 onclick, ontouch,ontouchevent的执行的顺序是什么?(B)你是怎么知道的(A)

一段源码告诉你,在View的dispatchTouchEvent中,onclick是写在onTouchEvent中的。

所以正确的顺序应该是onTouch —-> onTouchEvent ——–> onClick

9. android的跨进程通信知道那些?(B)

(1) activity的startActivity方式,activity可以直接通过filter去启动其他应用中定义了intent-filter的activity,然后进行跨进程通信(2) content provider的跨进程共享数据(3) 广播的被动跨进程通信(4) AIDL的binder机制。

9-1 单单从耦合度分析,广播机制和binder机制有什么不同呢?(B)

广播的发送者和接收者互相都是不知道对方的,而binder则不同,相比前者耦合度更低,可拓展性更强.

9-1-1 广播的静态注册和动态注册分别是怎么实现的呢?有什么不同呢?(B)

静态注册是在androidManifest文件中进行receiver注册,设置相应的intentfilter的action;动态注册直接在代码中进行receiver注册.不同的地方在于动态注册的广播可以进行unRegister,且退出应用了之后就不会再接收到广播,但是静态注册的广播即使退出了应用还是会收到广播.

10. 移动端的网络优化,想的到哪些?(B↑)

连接复用:默认情况下,httpurlconnection都是开通了keep-alive的功能的

合并请求:对于界面中出现频繁请求的情况,可以将请求进行合并,一次性请求。

请求压缩: post请求,请求的body或者是header都可以进行gzip压缩; 对于返回数据的格式相差不是很大的,也可以对key部分进行压缩。

根据用户的网络质量,判断下载什么质量的图片。本地还可以做静态缓存。

直接访问IP,而非域名: 使用动态的IP列表,直接访问IP,一旦IP不能访问了,再用域名进行访问。

增量更新:对新增的数据进行更新,bsdiff和bspatch

预连接和预取数据:

对请求分优先级

11. service知道多少,一个service从定义到使用大体讲一下?(B)

Service是由framework层的ActivityServiceManager管理的生命周期长、运行于后台的服务性组件。Service本身是运行在当前应用进程的主线程中,但是可以在Service中开辟子线程以实现音乐播放、数据库交互、文件操作等耗时操作(因为绝大多数情况下Service没有前台界面)。需要在manifest文件中声明

service的启动有startService和bindService两种方式,前者当应用退出时,依然可以运行,除非调用了stopself或者是系统调用了stopService,而后者则是通过unbindService解绑.

oncreate方法只会执行一次,但是每次调用都会执行onStartCommand(startService)/onBindSerivce(bindService0,当调用了stopSelf或者是stopservice之后如果又绑定就执行onUnBind,否则就直接执行onDestory方法.

onstartCommand根据具体的返回值来判断service被kill了之后如何重启service.

那么综上,

1. 自定义的service继承service,我们可以通过具体的需求选择是复写它的onStartCommand方法还是onBind方法去实现.

2. 去清单文件注册service

3. 通过startService的方式或者是bindService的方式来实现.startService直接启动service,bindService则需要传入ServiceConnection接口,我们可以在接口方法onServiceConnected中去做逻辑处理,或者自定义处理或者将IBinder取出做处理

11-1 service和应用是在一个进程中么?本身是一个线程么?(B)

本身既不时线程也不是进程,service是在主线程中进行的.

11-1-1 intentService和service有什么不同呢?(A)

intentService不用去起新线程就可以执行耗时的操作,内部是利用handler来处理源源不断的intent请求,将intent加入队列,然后依次进行处理.所以在intentService中我们只需要去实现onHandleIntent方法就可以了,而service是在主线程中进行的,需要去另起线程才可以处理耗时的操作.

intentService需要定义一个构造函数,在构造函数中调用super方法,传入该服务的名字,来给intentService命名,因为intentService不需要在manifest文件中注册. 11-1-2 intenService内部源码看过么?它是如何做到不用新起线程就可以去执行耗时的操作的?(A↑)

实际上就是looper的原理。我们进它的源码看一看:

新起一个线程,获得它的looper,创建相应的handler

这样他就通过handler去不断的循环新扔进来的intent,然后进行处理。所以在intentService中,我们可以直接在onHandleIntent中处理耗时任务。

12. 碰到过哪些异常,讲一讲。(B↑)

(1) Can not perform this action after onSaveInstanceState

在Activity保存了状态之后,再对fragmentManger进行commit事务的操作就会造成这个错误,一般最省力的办法就是把commit改成commitAllowStateLoss

(2) NetWork on main thread

在主线程中进行网络请求

(3) ClassCastException

类型强转错误

(4) IndexOutOfBound

数组越界

(5) outOfMemory

13. 不同的屏幕分辨率,如何去适配呢?(C)

最常用的方法是用不同的分辨率文件夹,保存不同分辨率的图片到相应的文件夹下,对于单色图标来说,最好的方法是使用矢量图来解决,既可以适配不同分辨率,又可以帮apk瘦身。

在布局方面,我们尽可能的去使用relativelayout,强调的组件和组件之间的位置关系,避免了直接将大小写死,可以很好的适配不同的分辨率,最新的android.support.constraint.ConstraintLayout更是将其发挥到极致。或者我们也可以为不同的屏幕做不同的布局,放在相应layout文件夹下。

13-1 知道那些layout,和drawable文件夹?(C)

各尺寸

13-1-1 hdpi和mdpi哪一个大一点(C)

hdpi..

14. 内存泄露的原因知道哪些?(C)

(1)集合类

只知道添加,而没有做好具体的删除工作的话,那么如果遇到全局的集合变量,就会导致这个集合所占用的内存只增不减

(2)单例模式

一般见得最多的就是写的一些util类,为了需要展示或者是做一些需要context的有关操作,就需要传入context,而为了让Util可以直接进行方法调用,就会将一些方法写成static,然后本类的context对象不得不定义为static,就不得不去静态持有外部的对象,这样以来,当外部对象已经不可到达了之后(javaGC),由于被这个util持有,依然无法回收,就泄露了。

(3)Android特殊的组件需要手动的去关闭

比如BroadCastReceiver,ContentReceiver,FileObserver,Callback什么的都需要在onDestory方法或者在activity的生命周期结束的时候回收,否则activity会被系统强引用,无法回收。

(4)handler

只要handler中的message没有被处理完,那么这个message就会和他的hander被MessageQueue一直持有,需要在相应的位置对handler进行removeMessageCallback等操作

(5)线程造成的内存泄露

线程的生命周期和activity不一样,就会导致activity中新起的线程,持有activity的一个引用,结果run方法还没有结束的话,activity就不会释放,如果此时activity早就已经用不到了,久造成了内存泄露。

(6)不良的代码习惯

比如bitmap没有及时的recycle,各种io流没有及时的close,adapter中没有使用convertView

14-1 讲一讲你所知道的java的GC算法吧 (B↑)

引用计数:一个对象被引用计数器加一,取消引用计数器减一,引用计数器为0才能被回收。优点:简单。缺点:不能解决循环引用的问题,比如A引用B,B引用A,但是这两个对象没有被其他任何对象引用,属于垃圾对象,却不能回收;每次引用都会附件一个加减法,影响性能。

标记清除法:分为两个阶段:标记阶段和清除阶段。标记阶段通过根节点标记所有可达对象,清除阶段清除所有不可达对象。缺点:因为清除不可达对象之后剩余的内存不连续,会产生大量内存碎片,不利于大对象的分配。

复制算法:将内存空间分成相同的两块,每次只是用其中的一块,垃圾回收时,将正在使用的内存中的存活对象复制到另外一块空间,然后清除正在使用的内存空间中的所有对象,这种回收算法适用于新生代垃圾回收。优点:垃圾回收对象比较多时需要复制的对象恨少,性能较好;不会存在内存碎片。缺点:将系统内存折半。

标记压缩算法:是一种老年代回收算法,在标记清除的基础上做了一些优化,首先从根节点开始标记所有不可达的对象,然后将所有可达的对象移动到内存的一端,最后清除所有不可达的对象。优点:不用将内存分为两块;不会产生内存碎片。

分代算法:新生代使用复制算法,老生带使用标记清除算法或者标记压缩算法。几乎所有的垃圾回收期都区分新生代和老生带。

分区算法:将整个堆空间分成很多个连续的不同的小空间,每个小空间独立使用,独立回收。为了更好的控制gc停顿时间,可以根据目标停顿时间合理地回收若干个小区间,而不是整个堆空间,从而减少gc停顿时间。

14-2 你所知道的哪些东西需要及时的去关闭或者是释放的?(B)

比如BroadCastReceiver,ContentReceiver,FileObserver,Callback什么的都需要在onDestory方法或者在activity的生命周期结束的时候回收,否则activity会被系统强引用,无法回收。

比如bitmap没有及时的recycle,各种io流没有及时的close,adapter中没有使用convertView

15.scrollView怎么去判断有没有滑到了底部?(A)

首先我们判断肯定是要放在touch监听当中,比如scrollview的onTouchListener或者是他自己的onScrollChange中。

在ontouch中,当检测到up动作的时候,判断getScrollY + getHeight = view.getChildAt(0).getMeasureHeight()的时候就是到了底部

或者在onScrollChange方法中,通过View view = (View)getchildAt(getChildCount() - 1)获得最下面的一个view(其实就是scrollView包裹的唯一子view),然后获得它的高度,view.getBottom(),然后当这个高度等于scrollY+ getHeight的时候就是滑到了底部

15-1 getScrollY()表示什么意思?

可以理解位控件上方滑出屏幕的距离,如果为负,就表示已经滑到了控件的顶端

16. assets和raw有什么不同和相同?(C)

两个文件夹的文件都不会跟着压制apk被编译压缩,都是原封不动的保存。raw文件下不可以再有目录,而assets文件下可以再有目录

raw文件夹下面的文件会映射到R文件中,调用的时候直接去使用R.raw.xxxx就可以访问,getResources().openRawResource(R.raw.rawtext)

而assets文件下的文件访问的时候需要用到AssetManager,AssetManager assets = getAssets(); assets.open(123.txt);

16-1 什么时候用assets,什么时候去用raw

有些文件不得不放在raw中,因为直接可以通过R文件去访问,可以直接在xml文件中去访问他,而assets中由于没有产生R文件的映射,访问的速度应该是没有Raw文件来的快的。

17. 数据持久化的四中方式?(B)

preference,SQlite,文件I/O,ContentProvider

18. 显式和隐式的intent调用分别怎么调用?(C)

显式:intent直接定义的时候传入指定的class,或者是component,或者是setClass/setClassName

隐式:不明确指定具体的class,而是采用setAction的方式,来启动注册了添加了这个action的filter的activity。如果找到一个就打开一个,如果找到多个,系统会让你进行选择,,如果一个都没有找到,就跳出来activitynotfoundexception

19. 自定义viewgroup,实现过么?(C)

继承自ViewGroup,主要的就是实现onMeasure方法和onLayout方法,因为onDraw方法只需要调用super.onDraw方法即可。

在onMeasure,根据获得父框架给予的宽高大小和宽高模式,来计算子view排布之后的布局的宽高。如果在xml文件中直接定义了dp的具体数值,或者是直接是match_parent,则直接调用setMeasuredDimension((modeWidth == MeasureSpec.EXACTLY)?sizeWidth: width, (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight: height); 根据尺寸模式来判断是要使用自己计算出来的宽高还是父框架给予的宽高

在onLayout中,就对子view进行排布。定义left = 0,和top = 0,然后根据分布的规则,遍历自view,计算出他们的left,top,right,bottom的值,然后调用自view的layout方法,去排列它们

19-1 具体需要实现哪些方法呢?(B)

onMeasure, onLayout,依据情况还可以实现onDraw等方法

19-1-1 知道流布局么,让你实现怎么实现,大体讲一讲?(A)

通过onMeasure对内部组件进行遍历计算宽度和高度,如果内部组件的宽度和(包括margin)比父类给予的宽度大了就开第二行进行计算,并叠加高度,.依次来进行计算控件的宽高,然后调用setMeasureDimension.

通过onLayout来计算坐标点,计算方式跟onMeasure方式相同,只是宽高存储改为坐标存储.

20. 题外问题

20-1 为什么android的包名用com.xxxx.xxxx方式?(C)

java项目遗留下来的不成文的规定,习惯问题,com代表公司,org代表个人,也完全可以用自己喜欢的方式,主要就是为了防止出现包名重复出现问题.

21.自定义问题

21-1 五个控件,左右顶格,距离相等,horizental

22.什么叫事件驱动

通过行为动作比如一个点击,一个触摸等等,程序就会给出相应的反馈,就是事件驱动。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。