经朋友推荐,昨天下午去网易杭州公司参加了考拉海淘android客户端的面试。今天回忆一下面试题目,做个整理进行备案。

1、说说JVM垃圾回收机制。

1.1、画了JVM分代回收的图,大致说了下垃圾分代回收的机制,并且说了年轻代和年老代GC的算法分别是“停止-复制”法和“标记-整理”法。

1.2、这时面试官问我年轻代中survivor0和survivor1之间的复制是如何进行的?我说当survivor0区域也满了的时候,仍然存活下来的对象直接复制到survivor1中,这个答案他并不满意,不过我也说不出具体复制的策略,所以这个问题翻篇了。

1.3、面试官又问我你觉得这三个内存区里哪几个可能会发生内存溢出?我说方法区不可能,年老代会发生内存溢出。他反问我年轻代不会发生内存溢出吗?我急忙说也会。。。其实仔细想想三个区都有可能发生内存溢出。

1.4、方法区中的static变量什么时候分配内存什么时候被回收?分配是在类加载的时候,回收是在该类的Class对象被回收了,static变量才会被回收,因为static变量始终会有一个Class 对象的句柄指向它,static变量是属于类级别的。

参考资料。

2、让我选自己做过的项目中的一个,问我这个项目涉及到哪些安卓相关技术?

我选了自己最有把握的一个,说涉及到的安卓相关技术有Activity.....没说完,他就让我说一下Activity的生命周期,我画了个完整的Activity生命周期图。他问我如果一个位于前台的Activity,执行finish方法,会触发哪些生命周期的方法?我说OnPause()->OnStop()->OnDestory()。然后他让我再说一下Activity的启动模式。。对于singleInstance这种启动模式我没解释清楚,其实也是没有理解。

参考资料。

3、遇到过ANR吗?

Android not responding。我说在主线程中进行比较耗时的操作会造成ANR,比如网络请求和数据库操作等耗时的操作,给用户一种界面假死的错觉。如何解决ANR?将耗时的操作放在子线程中执行,通过handler来实现主线程和子线程的通讯,比如对UI界面进行刷新。

4、安卓网络请求的方式?

主要有两个类来完成,一个是HttpURLConnection,另一个是HttpClient。他问我我这个项目中的网络请求是怎么实现的?我说通过开启一个子线程来完成网络请求操作,用HttpClient来执行HttpPost对象以实现http post请求,当服务器端成功返回数据后,将返回的json格式的数据封装成json类,然后用主线程的handler执行sendMessage(Message msg)方法,主线程中handler执行handleMessage(Message msg)方法对json类进行处理。另一个面试官问到handler是在哪个线程中执行的?我回答道是主线程。他又说handler可能导致内存泄漏,你如何解决?我说道可以在Activity的OnDestory()方法中加入handler.removecallbacks(Runnable Thread)来结束线程。

5、多线程并发问题,如何实现同时从服务器端下载20张图片(不用异步下载的框架,就用handler实现)?

1、第一种方法效率比较低:开启20个下载图片的线程,每个线程下载完毕后用,创建一个Message msg = handler.obtainMessage(id,bitmap)(hanlder为主线程的中定义的handler),然后handler.sendMessage(msg);主线程中handler.handleMessage(Message msg)根据msg的id,将bitmap赋予对应的imageView;

2、显然第一种方法虽然实现了线程并发,但要开启20个线程,显然占用很大的系统资源和内存,容易出现OOM。下面说一下一个带有下载功能的缓存框架的实现思路:

2.1、将url和imageView封装成一个类叫做ImageRef.

2.2、定义一个图片加载栈mImageStack,一个请求更新UI的队列mImageQueue.

2.3、下载20个图片,可以用一个循环依次将20个封装好的ImageRef对象加入到mImageStack中.

2.4、定义一个加载图片的handler,实现图片下载。

2.5、如果handler为空,则创建一个HanlderThread,并将其Looper给予handler,由handler来负责处理Looper从该线程中抽取的Message。

2.6、从mImageStack中pop一个imageRef,handler.sendMessage(new Message(id,imageRef)),handler.handleMessage(Msg)在handler线程中下载图片,下载得到bitmap后,由ui线程的handler,取名为handler2发送封装了bitmap的message.并且将用来标记图片加载线程是否可用的isLoading设置为false,表示图片加载线程不可用。

2.7、在handler2.handleMessage(Message msg)中从mImageQueue中取出对头元素imageRef,然后更新其中的mageView,并将isLoading设置为ture.

2.8、重复第6步。

6、项目中有没有自定义的view?

我说了两个,一个是首页的瀑布流效果的scrollView,是由左右两个LinearLayout实现的;还有一个是流布局FlowLayout,这个view其中有一个面试官问我是继承自哪个类的,我说是LinearLayout,他说应该是ViewGroup。回来一看还果真是ViewGroup,确实牛。。。

7、知道的设计模式有哪些?

有两类,一类是创建者模式,还有一类是结构型模式。创建者模式:多个方法工厂模式、静态方法工厂模式、抽象方法工厂模式、单例模式、原型模式;结构型模式:装饰器模式、适配器模式和代理模式。然后他问我知道观察者模式吗?这个。。。我知道在ContentProvider中的运用,并不知道其实现原理。然后起身走开,让我单独写一下观察者模式的结构。。。

详情点击。

安卓中的设计模式。

2015年网易考拉海淘android面试的更多相关文章

  1. 网易考拉Android客户端网络模块设计

    本文来自网易云社区 作者:王鲁才 客户端开发中不可避免的需要接触到访问网络的需求,如何把访问网络模块设计的更具有扩展性是每一个移动开发者不得不面对的事情.现在有很多主流的网络请求处理框架,如Squar ...

  2. megalo -- 网易考拉小程序解决方案

    megalo 是基于 Vue 的小程序框架(没错,又是基于 Vue 的小程序框架),但是它不仅仅支持微信小程序,还支持支付宝小程序,同时还支持在开发时使用更多 Vue 的特性. 背景 对于用户而言,小 ...

  3. 考拉Android统一弹框

    作者:钱成杰 背景 在快速开发的背景下,经历了n个版本后的考拉Android App中已经存在了各种各样看似相同却各有差别的弹框样式.其中包括系统弹框和自定义弹框,并且在线上时常会出现IllegalA ...

  4. 阿里、腾讯、百度、网易、美团Android面试经验分享,拿到了百度、腾讯offer

    基本情况 2021届普通本科,Android开发岗. 此文主要是2020年秋招面试经验汇总,最终拿到了百度.腾讯的offer. 主要包括阿里三面,腾讯四面,百度三面,网易三面,美团一场面完. 阿里(由 ...

  5. 考拉定时任务框架kSchedule

    此文已由作者杨凯明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.背景 目前项目中使用的定时任务框架存在下面这些问题 没有统一的定时任务管理平台 目前项目中使用定时任务的 ...

  6. 百度的android面试总结分析

    今天就是今天上午10点,我接到了百度的电话面试,当然提前和我说了,我的拖延症是有多强烈,以至于我没怎么准备,当然我也想着看看自己的真实水平,在此检讨一下!!!!!!!!!!!!!!!!!!!!!!!! ...

  7. Android面试优雅地介绍自己的项目

    本文转载:m.blog.csdn.net/iamsamzhang/article/details/51916584 先说句题外话,很多公司16年秋招的内推已经开始啦,我目前知道的在北京有网易.百度和微 ...

  8. 只要套路对,薪资直接翻一倍!保姆级Android面试葵花宝典,肝完面试犹如开挂

    跳槽,这在 IT 互联网圈是非常普遍的,也是让自己升职加薪,走上人生巅峰的重要方式.那么作为一个普通的Android程序猿,我们如何才能斩获大厂offer 呢? 疫情向好.面试在即,还在迷茫踌躇中的后 ...

  9. Android面试一天一题(1Day)

    写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...

随机推荐

  1. Java学习笔记--Swing2D图形

    1.处理2D图形 要想使用java 2D库绘制图形,需要获得一个Graphics2D类对象.这个类是Graphics类的子类.paintComponent方法自动获得一个Graphics2D类对象,我 ...

  2. 利用Azure高级存储搭建高性能Linux服务器(1)

    目前Azure针对虚拟机提供两种类型的存储,一种是标准存储,基于HDD的,一种是高性能存储Premium Storage(在下文中简称PS),基于SSD的.针对用户高性能,低延迟,I/O密集型的应用, ...

  3. adb调试实用命令

    获取设备IMEI: adb shell dumpsys iphonesubinfo 文件在设备和PC端的操作:adb push [PC端源文件路径] [设备的目的文件路径] 例如:adb push C ...

  4. hdu 3832 Earth Hour

    http://acm.hdu.edu.cn/showproblem.php?pid=3832 #include <cstdio> #include <iostream> #in ...

  5. 【czy系列赛】czy的后宫4 && bzoj1925 [Sdoi2010]地精部落

    [问题描述] czy有很多妹子,妹子虽然数量很多,但是质量不容乐观,她们的美丽值全部为负数(喜闻乐见). czy每天都要带N个妹子到机房,她们都有一个独一无二的美丽值,美丽值为-1到-N之间的整数.他 ...

  6. Asp.net MVC中的ViewData与ViewBag(转)

    在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...

  7. UVA 11374 Airport Express(枚举+最短路)

    枚举每条商业线<a, b>,设d[i]为起始点到每点的最短路,g[i]为终点到每点的最短路,ans便是min{d[a] + t[a, b] + g[b]}.注意下判断是否需要经过商业线.输 ...

  8. win10无法使用内置管理员账户打开

    对于这种问题其实对于专业版用户倒不是难事,很容易解决,具体方法如下: 首先WIN+R输入:gpedit.msc,打开组策略,找到“计算机配置”里面的“Windows设置”,打开“安全设置” -> ...

  9. hdu 2846

    字典树的变形,常规字典树用来求前缀的,所以把每个单词拆成len个词建树,为了避免abab这样的查ab时会出现两次,每次加一个标记,如果该节点上次的建树的单词与本次相同就不更新,否则更新 #includ ...

  10. 一步一步学数据结构之n--n(Prim算法)

    在这里说下最小连通网的Prim算法: 而Kruskal算法,http://blog.csdn.net/nethanhan/article/details/10050735有介绍,大家可以去看下! Pr ...