Android 一些面试问题收集

前言因为最近换工作,所以需要面试,但是面试了3家只有一个offer,只是可能因为工资问题最终还是需要继续面试,同时感觉每次面试都不做任何准备,不看面试题,不去温习一下书本,感觉临场表现可能的确不行吧,所以本文主要记录在面试中被遇到的一些问题和一些我觉得的答案,以做记录,不过通过三次面试感觉有时候面试多点也好,毕竟一般公司都会问你公司所在乎的问题(反正我之前面试别人就是这样),所以很多时候吧面试的问题拿来学习,也是一种不错的办法,同时也请教一下,怎么样才能增加面试机会啊,投了几天简历了,才收到4个面试通知(其中2个直接邮件通知,因为预约的时间相同,所以只去了一家),在boss直聘上问也没人回答,甚至看都不看,这是什么鬼? 正文好了下面就是面试中遇到的一些问题了 1.网络优化**问题:**有没有做过网络优化,比如信号不好和手机网络状态频繁变化的情况下做了什么优化 答案: 底层优化:1、IP访问  通过IP和域名结合访问方法,因为域名解析也需要一定的时间,所以直接通过IP访问会比域名要更快,当然因为IP随时可能会变,所以我们存储的IP是一个动态IP,一旦IP发生改变请求失败时,就通过解析域名获取新的IP,通过新的IP来访问 2、链接复用  可以节省连接建立时间,如开启 keep-alive,Http 1.…

Glide加载圆形和圆角图片+使用记录

前言因为项目中使用了Glide,同时了为了兼容性,所以在加载圆角和圆形图片的时候,是使用Gilde来实现,而不是通过自定义控件,此文是记录下如果通过Glide加载圆形和圆角图片,以及在使用Glide中常用的一些方法 加载有效果的图片方式Glide可以通过设置transform或者设置bitmapTransform来实现各种现实效果,本文是通过设置transform来实现的圆角和圆形图片 加载圆角图片调用代码 Glide.with(activity).load(uri).centerCrop().diskCacheStrategy(DiskCacheStrategy.ALL) .transform(new CornersTransform(activity)) .placeholder(R.drawable.ic_gf_default_photo) .error(R.drawable.ic_gf_default_photo) .crossFade() .into(imageView); import android.content.Context; import android.graphics.Bitmap; import android.…

Android自定义控件之全文收起TextView(继承TextView法)

前言因为公司项目需要全文收起的功能,一共有2种UI,所以需要写2个全文收起的控件,关于第一个控件已经在第一篇文章讲述嵌套法实现全文收起TextView,本篇文章主要讲述直接继承至TextView的实现方法 效果图实现原理通过另外一个方法设置文本,同时在GlobalLayoutListener中计算每行出需要显示的总行数,判断是否需要全文收起功能,如果需要,则计算出每行需要显示多少文本,在设定的最大行计算时,把...+全文加进去计算,得到实际上应该显示的文本,同时把全文设置为可点击的文本,在点击事件中根据状态设置当前TextView显示的文本,如果当前状态是收起状态,点击后就设置显示所有文字+收起,全文状态则设置显示文本为最开始计算出来的文本 代码package wang.raye.library.widge; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.text.SpannableStringBuilder; import android.text.Spanned;…

Android自定义控件之全文收起TextView(控件嵌套法)

前言因为公司项目需要全文收起的功能,一共有2种UI,所以需要写2个全文收起的控件,之前也是用过一个全文收起的TextView控件,但是因为设计原因,在ListView刷新的时候会闪烁,我估计原因是因为控件本身的设计是需要先让TextView绘制完成,然后获取TextView一共有多少行,再判断是否需要全文收起按钮,如果需要,则吧TextView压缩回最大行数,添加全文按钮,这样就会造成ListView的Item先高后低,所以会发生闪烁,后面我也在网上找了几个,发现和之前的设计都差不多,虽然肯定是有解决了这个问题的控件,但是还是决定自己写了,毕竟找到控件后还需要测试,而现在的项目时间不充分啊(另外欢迎指教如何快速的找到自己需要的控件,有时候在Github上面搜索,都不知道具体该用什么关键字),而且自己写,也是一种锻炼。这里讲述的是布局式的实现,还有一个就直接继承TextView来实现那个会在下一篇文章讲述。Android自定义控件之全文收起TextView(继承TextView法) 效果图实现原理其实很多全文收起的实现原理应该都差不多,首先外部是一个布局,里面放一个显示正文的TextView控件,设置文本后,判断正文TextView的控件到底有多少行,如果达到了全文收起的行数,则将TextView的高度修改为指定的行数高度,把状态设置为收起状态,并在布局中添加全文收起按钮,点击全文时,则把高度还原为控件本身的高度,把状态位置为全文状态,点击收起时,则把控件高度设置为指定行数的高度,状态设置为收起状态。 代码package wang.raye.library.widge; import…

自定义控件之重写ScrollView实现图片下拉放大

前言因为公司项目要实现一个效果,在ScrollView没有向下滚动时,下拉(未重写前下拉是没有任何效果的)放大顶部的图片,当时去网上找了,记得以前见过很多这样的控件的,现在却找半天也很难找到一个,好不容易找到了2个,发现效果都和需求上面的效果有偏差,最后没有办法只能是自己写了,花费了半天时间研究出来了,同时为了记录实现思路,所以就有了此文章 效果实现思路拦截ScrollView的触摸滑动事件(ACTION_MOVE),记录下当前事件y轴坐标,判断当前ScrollView的Y轴滚动进度(getScrollY)是否等于0,等于0就与上次事件记录的位置进行对比,如果为正数就放大(X轴是从左往右,Y轴是从上往下,所以下拉时本次事件的Y轴会大于上次事件的Y轴),每次事件都通过设置ImageView的高度来放大图片控件(本来想用属性动画的,但是因为每个事件放大的比例非常小,所以最后就没使用,直接通过修改属性来实现),同时记录从开始到现在事件位置一共偏移了多少,当偏移量大于最大值的,就停止放大并将偏移量设置为最大值,当偏移量小于0时,则将偏移量设置为0,同时不再继续拦截事件。注意被放大的图片需要设置scaleType为centerCrop,这样当图片高度发生变化时,图片内容才会跟着大,当然其他几种模式有些模式也能跟着放大,但是具体可以自己去测试,我就不去测试了,毕竟我已经达到我要的效果了 好了,废话少说,先贴代码,再对代码进行说明 代码package wang.…

Android APP架构心得

前言从JavaEE转到Android开发也2年多了,开发的项目也有4,5个了(公司项目),其中有3个项目前期都是自己独立开发,从一开始的毫无架构到现在对如何架构也有一点心得,所以在此分享出来,大家一起交流 什么是架构在我看来,软件架构绝对不只是框架的堆砌,看我看来,架构是为了方便软件维护、扩展、安全性、切入性(我也不知道有没有人提出过这个关键字,因为的确很少看见,简单来说我这里说的切入性就是指一个以前没有接触过这个项目的人,能快速加入到这个项目中,对项目进行维护、修改和扩展) 维护性一个好的软件(不一定是成功的软件,这里说的好只是程序员认为的代码方面)肯定是能方便维护的,出了问题能快速定位,需要修改时能快速修改,并且在一定程度上不会说一修改就一堆bug,这就是我认为的可维护性,当然后面要说到的切入性其实也算是维护性,不过为什么单独放出来在切入性时我会详细说明。至于怎么样才能使一个软件维护方便,我觉得有以下几点: 1.代码规范一份代码如果没有遵循任何规范,那么我相信它的可维护性是很差的,就算是你一个人做出来的,估计过了几个月去修改的时候也会冒出一句这TM是什么鬼 2.框架稳定性很多时候很多开源框架刚出来的时候,也许功能十分强大,但是毕竟刚出来,没有经过充分的测试,所以还是会或多或少存在一个不稳定因子,所以建议在选择框架时尽量选择成熟稳定的框架,哪怕功能和性能的确比不上刚出来的框架。当然这也不是说完全不用刚出来的框架,毕竟都不用,那么它也永远成熟不了,至于到底用不用和怎么用,…

Android Studio插件推荐(PreIOC,GsonFormat)

好的插件能加快项目的开发速度,尤其是一些针对重复性的代码的插件,所以在这里向大家推荐2款不错的插件,如果以后发现新的好的插件,还会继续推荐,同时欢迎大家推荐GsonFormatGsonFormat是一款将json直接转换成JavaBean的工具,这样就避免了我们经常需要照着接口文档来写实体类bean,而且还要看着不要写错,同时也节省了大量的时间 第一步:安装首先点击设置按钮,通过File菜单进入设置也行 然后选择Plugins 在上面输入框输入GsonFormat或者gson都行 然后点击browse 选择GsonFormat 点击右边的install,然后就等待安装完成并且重启 第二步:使用首先我们创建一个类(类名不限),然后在类中按下alt+insert 或者右键点击generate也行,选择选择gsonformat, 或者完全可以直接按快捷键alt+s会弹出一个框 ,吧得到的json复制进输入框点击ok 在点击ok就能直接生成bean了 我是用以下json生成的bean { "people":[ {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, {"firstName":"Elliotte","lastName":"Harold","email":"cccc"} ] } JavaBean…

EventBus3.0的入门和使用

前因因为公司项目中使用EventBus,所以需要进行了解,本来还以为EventBus会很难理解,但是网上查了一下,发现上手很快,而且也没有什么特别难懂的地方,这篇文章记录我对EventBus的一些理解 使用场景经常会遇到,有时候发生了一个事件,需要在别的activity或者Fragment或者其他类中进行处理,以前我们是通过广播去实现,但是当一个Activity需要处理很多种事件时,广播管理起来就会麻烦很多,尤其是对于一些多线程之间的消息,用广播和handler固然可以,但是消息过多处理起来就比较麻烦了,所以EventBus就出现了(以上纯属个人理解) EventBus概述EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。 1、下载EventBus github gradle compile 'org.greenrobot:eventbus:3.0.0' Maven <dependency> <groupId>org.greenrobot<…