首页 文章 精选 留言 我的

精选列表

搜索[禅道API],共10000篇文章
优秀的个人博客,低调大师

31道Android面试题 ,牢固你的基础!

阅读目录 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常 4.Android 中如何捕获未捕获的异常 5.ANR 是什么?怎样避免和解决 ANR(重要) 6.Android 线程间通信有哪几种方式 7.Devik 进程,linux 进程,线程的区别 8.描述一下 android 的系统架构 9.android 应用对内存是如何限制的?我们应该如何合理使用内存? 10. 简述 android 应用程序结构是哪些 11.请解释下 Android 程序运行时权限与文件系统权限的区别 12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 13.多线程间通信和多进程之间通信有什么不同,分别怎么实现 14.Android 屏幕适配 15.什么是 AIDL 以及如何使用 16.Handler 机制 17.事件分发机制 18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么 19.子线程中能不能 new handler?为什么 20.Android 中的动画有哪几类,它们的特点和区别是什么 21.如何修改 Activity 进入和退出动画 22.SurfaceView & View 的区别 23.开发中都使用过哪些框架、平台 24.使用过那些自定义View 25.自定义控件:绘制圆环的实现过程 26.自定义控件:摩天轮的实现过程 27.GridLayout的使用 28.流式布局的实现过程 29.第三方登陆 30.第三方支付 31.进程保活 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 可以参考博客:Android系统性能调优工具介绍 首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。 UI布局的分析,可以有2块,一块就是Hierarchy Viewer 可以看到View的布局层次,以及每个View刷新加载的时间。 这样可以很快定位到那块layout & View 耗时最长。 还有就是通过自定义View来减少view的层次。 浅谈App的性能优化 Android性能优化:手把手带你全面实现内存优化 Android性能优化 (1)—— 内存溢出和内存泄漏的介绍 2.什么情况下会导致内存泄露 内存泄露是个折腾的问题。 什么时候会发生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。 I. 静态集合类引起内存泄露 主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。 II.remove 方法无法删除set集 Objects.hash(firstName, lastName); 经过测试,hashcode修改后,就没有办法remove了。 III. observer 我们在使用监听器的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak。 广播没有unregisterrecevier IV.各种数据链接没有关闭,数据库contentprovider,io,sokect等。cursor V.内部类: java中的内部类(匿名内部类),会持有宿主类的强引用this。 所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。 Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。 VI.单例 单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存leak。 3.如何避免 OOM 异常 首先OOM是什么? 当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后 这就会抛出 OutOfMemoryException 也就是OOM Android的OOM怎么样? 为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上限。 publicvoidgetMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); } HTC M7实测,192M上限。512M 一般情况下,192M就是上限,但是由于某些特殊情况,android允许使用一个更大的RAM。 如何避免OOM 减少内存对象的占用 I.ArrayMap/SparseArray代替hashmap II.避免在android里面使用Enum III.减少bitmap的内存占用 inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。 decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。 IV.减少资源图片的大小,过大的图片可以考虑分段加载 内存对象的重复利用 大多数对象的复用,都是利用对象池的技术。 I.listview/gridview/recycleview contentview的复用 II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8 这个方法在某些条件下非常有用,比如要加载上千张图片的时候。 III.避免在ondraw方法里面 new对象 IV.StringBuilder 代替+ 4.Android 中如何捕获未捕获的异常 CrashHandler 关键是实现Thread.UncaughtExceptionHandler 然后是在application的oncreate里面注册。 5.ANR 是什么?怎样避免和解决 ANR(重要) ANR->Application Not Responding 也就是在规定的时间内,没有响应。 三种类型: 1). KeyDispatchTimeout(5 seconds) —主要类型按键或触摸事件在特定时间内无响应 2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定时间内无法处理完成 3). ServiceTimeout(20 seconds) —小概率类型 Service在特定的时间内无法处理完成 为什么会超时:事件没有机会处理 & 事件处理超时 怎么避免ANR ANR的关键 是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算 而交给work thread操作。 1)避免在activity里面做耗时操作,oncreate & onresume 2)避免在onReceiver里面做过多操作 3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。 4)尽量使用handler来处理UI thread & workthread的交互。 如何解决ANR 首先定位ANR发生的log: 04-0113:12:11.572I/InputDispatcher(220): Applicationisnot responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event,5009.5ms since waitstarted CPUusage from4361msto699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872E/ActivityManager( 220):100%TOTAL:4.8% user +7.6% kernel +87% iowait04-0113:12:15.872E/ActivityManager( 220): CPUusage from3697msto4223mslater:-- ANR后CPU的使用量 从log可以看出,cpu在做大量的io操作。 所以可以查看io操作的地方。 当然,也有可能cpu占用不高,那就是 主线程被block住了。 6.Android 线程间通信有哪几种方式 1)共享变量(内存) 2)管道 3)handle机制 runOnUiThread(Runnable) view.post(Runnable) 7.Devik 进程,linux 进程,线程的区别 Dalvik进程。 每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。 所以dalvik进程和linux进程是可以理解为一个概念。 你真正了解Java虚拟机吗—高级开发必备《深入了解Java虚拟机》 8.描述一下 android 的系统架构 从小到上就是: linux kernel,lib dalvik vm ,application framework, app 9.android 应用对内存是如何限制的?我们应该如何合理使用内存? activitymanager.getMemoryClass() 获取内存限制。 关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。 10. 简述 android 应用程序结构是哪些 1)main code 2) unit test 3)mianifest 4)res->drawable,drawable-xxhdpi,layout,value,mipmap mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术. google建议只把启动图片放入。 5)lib 6)color 11.请解释下 Android 程序运行时权限与文件系统权限的区别 文件的系统权限是由linux系统规定的,只读,读写等。 运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。 12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。 简单来说framework就是提供app生存的环境。 1)Activity在attch方法的时候,会创建一个phonewindow(window的子类) 2)onCreate中的setContentView方法,会创建DecorView 3)DecorView 的addview方法,会把layout中的布局加载进来。 13.多线程间通信和多进程之间通信有什么不同,分别怎么实现 线程间的通信可以参考第6点。 进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast, Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。 14.Android 屏幕适配 屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。 dp来适配屏幕,sp来确定字体大小 drawable-xxdpi, values-1280*1920等 这些就是资源的适配。 wrap_content,match_parent, 这些是view的自适应 weight,这是权重的适配。 Android屏幕适配框架-(今日头条终极适配方案) 15.什么是 AIDL 以及如何使用 Android Interface Definition Language AIDL是使用bind机制来工作。 参数: java原生参数 String parcelable list & map 元素 需要支持AIDL 16.Handler 机制 参考:android 进程/线程管理(一)——消息机制的框架这个系类。 17.事件分发机制 android 事件分发机制 带你一起探究Android事件分发机制, 让面试提问不在畏惧! Android触摸事件分发机制完全解析《一》 18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么 EventBus,广播,view.post, runinUiThread 但是无论各种花样,本质上就2种:handler机制 + 广播 你真正了解UI线程更新的几种方式吗,面试必备之深度揭秘 19.子线程中能不能 new handler?为什么 必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。 带你一步一步深入Handler源码,拿下面试官不在话下 Handler消息机制完全解析(三)—Handler解析 Handler消息机制完全解析(二)MessageQueue的队列管理 Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉 20.Android 中的动画有哪几类,它们的特点和区别是什么 视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。 属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0 帧动画,通过drawable一帧帧画出来。 Gif动画,原理同上,canvas画出来。 具体可参考:https://i.cnblogs.com/posts?categoryid=672052 21.如何修改 Activity 进入和退出动画 overridePendingTransition 22.SurfaceView & View 的区别 view的更新必须在UI thread中进行 surfaceview会单独有一个线程做ui的更新。 surfaceview 支持open GL绘制。 二项目框架的使用 23.开发中都使用过哪些框架、平台 I.EventBus 事件分发机制,由handler实现,线程间通信 II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils III.百度地图 IV.volley V.fastjson VI.picciso VII.友盟 VIII.zxing IX.Gson 24.使用过那些自定义View pull2RefreshListView 25.自定义控件:绘制圆环的实现过程 publicclassCycleViewextendsView{ Paint mPaint =newPaint();publicCycleView(Context context){this(context,null); }publicCycleView(Context context, AttributeSet attrs){super(context, attrs); initView(); }privatevoidinitView(){ mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @OverrideprotectedvoidonDraw(Canvas canvas){super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); } } 关键是canvas.drawCycle & paint.setsytle(stoken) 26.自定义控件:摩天轮的实现过程 参考链接 https://github.com/danylovolokh/LondonEyeLayoutManager 27.GridLayout的使用 参考链接 https://blog.csdn.net/k316378085/article/details/52316633 28.流式布局的实现过程 参考链接 https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1 29.第三方登陆 参考链接 https://blog.csdn.net/alpha58/article/details/75210753 30.第三方支付 参考链接 https://blog.csdn.net/androidstarjack/article/details/72669394 【干货】微信支付,银联支付,支付宝支付——三大支付总结你get到了吗 31.进程保活 参考链接 2018年Android的保活方案效果统计 原文发布时间为:2018-10-9 本文作者:yuer 本文来自云栖社区合作伙伴“终端研发部”,了解相关信息可以关注“终端研发部”。

优秀的个人博客,低调大师

大数据,小数据,哪道才是你的菜?

美国著名科技历史学家梅尔文•克兰兹伯格Melvin Kranzberg曾提出过大名鼎鼎的科技六定律其中第三条定律是这样的[1]“技术是总是配“套”而来的但这个“套”有大有小Technology comes in packages, big and small”。 这个定律用在当下是非常应景的。因为我们正步入一个“大数据big data”时代但对于以往的“小数据small data”我们能做到“事了拂衣去深藏身与名”吗答案显然不是。目前大数据的前途似乎“星光灿烂”但小数据的价值依然“风采无限”。克兰兹伯格的第三定律是告诉我们新技术和老技术的自我革新演变是交织在一起的。大数据和小数据他们“配套而来”共同勾画数据技术Data TechnologyDT时代的未来。 对大数据的“溢美之词”已被舍恩伯格教授、涂子沛先生等先行者及其追随者夸得泛滥成

优秀的个人博客,低调大师

LocalDateTime API 整理

对象介绍 Object desc format LocalDateTime 日期时间 yyyy-MM-dd'T'HH:mm:ss LocalDate 日期 yyyy-MM-dd LocalTime 时间 HH:mm:ss 获取对象实例 Function Desc now 获取当前时间 of 获取指定时间 判断 Prefix is Suffix desc after 是否在传入对象, 之后 before 是否在传入对象, 之前 equal 相等 supported 检查是否受支持( 字段支持, 单位支持 ) Demo LocalDateTime maxTime = LocalDateTime.now().plusSeconds(SendMessageConfig.getDelayTime()); if (messageDTO.getSendTime().isAfter(maxTime)) { return ViewUtils.build(ViewCodeEnum.ERROR.getCode(), "验证码超时", null); } 运算 Operation Prefix plus 加 Prefix minus 减 prefix get 获取 时间单位 Suffix Desc nanos 纳 seconds 秒 hours 小时 minutes 分钟 days 天 weeks 周 months 月 years 年 获取时间戳 Instant.now().toEpochMilli() System.currentTimeMillis()

优秀的个人博客,低调大师

使用docker api

前提: 系统centos 7 docker version 1.10.3 使用systemd启动docker 访问方式: 修改/usr/lib/systemd/system/docker.service中的ExecStart,添加host " -H tcp://0.0.0.0:1234 " ExecStart=/usr/bin/docker daemon $DOCKER_OPTS -H tcp://0.0.0.0:1234执行systemctl --system daemon-reload, 将docker守护进程绑定到网络接口1234上。 (我机器执行上述命令没起作用,我就重启了docker : systemctl restart docker.service) 这时候会看到1234端口被docker进程绑定了。 [root@node888 system]# ss -anp | grep 1234 tcp LISTEN 0 128 :::1234 :::* users:(("docker",8694,6)) 查看docker信息,验证绑定情况 docker -H localhost:1234 info 可以看到 Containers: 49 Running: 1 Paused: 0 Stopped: 48 Images: 6 Server Version: 1.10.3 Storage Driver: devicemapper Pool Name: docker-253:0-202045413-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 4.555 GB Data Space Total: 107.4 GB Data Space Available: 2.347 GB Metadata Space Used: 10.02 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.137 GB Udev Sync Supported: false Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file: /var/lib/docker/devicemapper/devicemapper/data WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning. Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.82 (2013-10-04) Execution Driver: native-0.2 Logging Driver: json-file Plugins: Volume: local Network: null host bridge Kernel Version: 3.10.0-229.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 15.52 GiB Name: tw-node1247 ID: 757V:3H6N:ACAT:OJJJ:S353:QAQV:63HH:DWWR:KVQD:PFEQ:TGST:LUZ2 Debug mode (server): true File Descriptors: 20 Goroutines: 35 System Time: 2017-03-05T20:29:46.906849392+08:00 EventsListeners: 0 Init SHA1: Init Path: /usr/bin/docker Docker Root Dir: /var/lib/docker Username: lixiaolun Registry: https://index.docker.io/v1/ 或者使用curl http://localhost:1234/info 查看image curl http://localhost:2345/images/json | python -mjson.tool

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册