妥妥的去面试之Android基础(五)

本文为正在寻找Android开发工作的你提供全面的面试准备指南,涵盖Android基础、内存管理、UI组件对比及常见面试陷阱解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想得到的机会才可能有机会入你怀中。

笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给一道找工作的小伙伴们一些帮助。笔者准备的内容大纲如下

7911186-9c84d76a4df01570.png
Android面试大纲.png

妥妥的去面试之Android基础(一)

妥妥的去面试之Android基础(二)

妥妥的去面试之Android基础(三)

妥妥的去面试之Android基础(四)

什么是OOM?

当前占用的内存加上申请的内存资源超过了Dalvk虚拟机的最大内存限制就会抛出Out Of Memory异常。

有什么方法可以避免OOM?

OOM在很多情况下都是因为图片加载问题,所以针对bitmap的优化可以在某种程度上避免OOM的发生

  • 对图片进行压缩(通过采样率)
  • 及时释放Bitmap内存
  • 选择合适的解码方式

还有没有其他的方法?

  • 适当使用软引用和弱引用
  • 采用内存缓存和磁盘缓存
  • 避免创建过多的对象,内存对象的重复利用(比如ListView中的convertview的复用)。
  • 避免在Android中使用Enum,枚举占用的内存比整型大多了。
    -避免在onDraw方法里面执行对象的创建

说说你知道的内存泄露的场景?

1.静态变量持有外部类的引用

静态变量和应用的生命周期一样,因为静态变量持有外部类的引用,当外部类被销毁时,就会导致外部类无法被GC,引起内存泄漏。所以尽量不要使用静态变量

2.单例模式引起的内存泄露

单例模式的对象的生命周期和应用程序一样长,所以它持有的引用也不能被GC,所以会引起内存泄露。

所以在单例模式中,可以把单例对象的引用指向整个应用,就可以避免内存泄露。比如正确的单例模式写法如下:

public class AppManager {
    private static AppManager instance;
    private Context context;
    private AppManager(Context context) {
        //this.context = context;  //会引起内存泄漏
        this.context = context.getApplicationContext();  //指向应用
    }
    public static AppManager getInstance(Context context) {
        if (instance != null) {
            instance = new AppManager(context);
        }
        return instance;
    }

3.AsyncTask引起的内存泄露

AsyncTask是持有外部类的引用的,当它后台任务没有完成时,它会导致外部类的引用无法被回收,引起内存泄漏。

所以可以通过让AsyncTask变成静态内部类,这样就不会持有外部类的引用了。
或者让它持有外部类的弱引用。

4.使用完的资源未关闭

比如说在Bitmap在使用完后一定要关闭资源(调用它的recycle方法)

5.注册没取消造成的内存泄漏

比如调用registerReceiver后未调用unregisterReceiver。

广播注册一般有几种,各有什么优缺点?

  • 第一种是常驻型(静态注册):当应用程序关闭后如果有信息广播来,程序也会被系统调用,自己运行。
  • 第二种不常驻(动态注册):广播会跟随程序的生命周期。

动态注册

优点: 在android的广播机制中,动态注册优先级高于静态注册优先级,因此在必要情况下,是需要动态注册广播接收者的。

缺点: 当用来注册的 Activity 关掉后,广播也就失效了。

静态注册

优点: 无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

Recyclerview和Listview的区别

  • 在ListView中,ViewHolder需要自己来定义。通过ViewHolder可以缓存item里的view控件实例,避免了在getview中重复创建带来的性能损耗,但这只是一种推荐的使用方式,不是必须使用的。而在RecyclerView中使用RecyclerView.ViewHolder则变成了必须,尽管实现起来稍显复杂,但是在性能提升上有很大的好处。
  • ListView只能在垂直方向上滚动,Android API没有提供直接让ListView在水平方向上面滚动的支持。但RecyclerView提供了多种类型的展示方式,很容易就能修改展示方式。
  • ListView对item的点击事件实现较为简单,Recyclerview的点击事件实现就相对复杂,但灵活性高。
  • ListView没有提供局部刷新,RecyclerView提供了局部刷新的方法,而且在局部刷新的时候有一个渐变的动画效果。

说说安卓为啥要加签名机制?

  • 用于发送者的身份验证。由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换。
  • 保证信息传输的完整性。签名对于包中的每个文件进行处理,以此确保包中内容不被替换。
  • 防止交易中的抵赖发生, Market 对软件的要求。

面试系列的文章都放于 面试妥妥的 建议小伙伴们关注该专题

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值