Android面试指南-面霸之路09-经验分享

  • android fragment和activity的区别
  • 可以理解Fragment是一种特殊的View,负责一个模块或者一个特殊部分的展示。
  • 大部分Fragment是依托于Activity存在的,由Activity的FragmentManager来管理
  • Fragment可以解决多Activity的问题,即将3.0之前的频繁Activity跳转改成一个Activity内Fragment的切换。
  • Fragment可以解决碎片化的问题。

最重要的区别Activity是一个Context是打通系统交互的一个壳,Fragment是一个实现ComponentCallbacks和 OnCreateContextMenuListener的Object。必须attach到一个Activity上。

  • 谈谈你对Bitmap的理解, 什么时候应该手动调用bitmap.recycle()

Bitmap是android中经常使用的一个类,它代表了一个图片资源。 Bitmap消耗内存很严重,如果不注意优化代码,经常会出现OOM问题,优化方式通常有这么几种: 1. 使用缓存; 2. 压缩图片; 3. 及时回收;

至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bitmao时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数据是分开存放的,Bitmap对象存在java Heap中而像素数据存放在Native Memory中,这时很有必要调用recycle回收内存。但是2.3之后,Bitmap对象和像素数据都是存在Heap中,GC可以回收其内存。


  • ViewPager中加载Fragment的优化问题?如何做到微信那样切换界面时的延时加载

除了重写Fragment的setUserVisibleHint()方法,还可以手动设置mViewPager.setOffscreenPageLimit();

private boolean hasLoadedOnce = false; // your boolean field

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (this.isVisible()) {
        // we check that the fragment is becoming visible
        if (isVisibleToUser && !hasLoadedOnce) {
                //do something
            }
        }
    }
}

    • android清单文件application节点增加tools:replace=""有什么用

    这个是android studio用的,对于Eclipse没有任何用。 android studio的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报错。 解决方法: 方法1: 在Manifest.xml的application标签下添加tools:replace="android:icon, android:theme"(多个属性用,隔开,并且记住在manifest根标签上加入xmlns:tools="http://schemas.android.com/tools",否则会找不到namespace哦)

    方法2: 在build.gradle根标签上加上useOldManifestMerger true (懒人方法)

    • mipmap文件夹和drawable文件夹的区别
    它只是用来放启动图标的
    它的好处就是,你只用放一个mipmap图标,它就会给你各种版本(比如平板,手机)的apk自动生成相应分辨率的图标,以节约空间。
    • 当ListView一直向下滑动时加载了很多图片,这时候如果再向上滑动,怎么处理之前已经加载好的图片?另外,不对加载好的图片处理的话一直向下滑会不会造成OOM

    如果你用框架的话,比如Picasso,Glide,就不用管它了......

    这些框架会自动回收不可见的View,所以不用担心OOM,我极端的测试过1000张 400x272 的图片,都没有卡。

    加载过的图片可以缓存在有缓存容量限制的内存中,如使用LruCache,同时也可以缓存在设置有缓存容量限制sdcard中。取图片时统一先向内存缓存中获取,内存缓存中获取不到则向sdcard缓存中获取,还是获取不到再进行下载或读取,获取成功后放入缓存。以上过程均在线程中进行。 这样在图片不断加载的过程中,始终能占用的内存只有缓存上限大小,超过缓存上限的图片将被释放。

    线程的话可以设置线程池,并设置线程池大小和执行策略(如FILO)

    • ?android:attr 和 ?attr/ 分别代表什么意思 有何区别

    ?attr表示引用的是当前主题中的资源。 ?android:attr/表示引用的是android系统中的一些资源。

    • 当一个全屏Activity A进入到带有ActionBar(或ToolBar)的非全屏Activity B时,怎么解决Status Bar闪动的问题?
    1. 给Activity在清单文件里设置全屏;
    2. 在该Activity执行Finish之前,执行下面语句:
      
      
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    • 简述MVC模式以及在你项目中的应用

    a.模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 b.视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。 c.控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分

    • View:自定义View或ViewGroup,负责将用户的请求通知Controller,并根据model更新界面;
    • Controller:Activity或者Fragment,接收用户请求并更新model;
    • Model:数据模型,负责数据处理相关的逻辑,封装应用程序状态,响应状态查询,通知View改变,对应Android中的datebase、SharePreference等。
    • Android有什么便捷的方式实现activity变暗的效果
      /**
         * 调整窗口的透明度
         * @param from>=0&&from<=1.0f
         * @param to>=0&&to<=1.0f
         * 
         * */
        private void dimBackground(final float from, final float to) {
            final Window window = getWindow();
            ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);
            valueAnimator.setDuration(500);
            valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    WindowManager.LayoutParams params = window.getAttributes();
                    params.alpha = (Float) animation.getAnimatedValue();
                    window.setAttributes(params);
                }
            });
    
            valueAnimator.start();
        }


    • 定位项目中,如何选取定位方案,如何平衡耗电与实时位置的精度?

    方案1: 考虑到应用中有多处地方需要使用位置请求,在Application类中开始定位,Application持有一个全局的公共位置对象,然后隔一定时间自动刷新位置,每次刷新成功都把新的位置信息赋值到全局的位置对象,然后每个需要使用位置请求的地方都使用全局的位置信息进行请求。 该方案好处:请求的时候无需再反复定位,每次请求都使用全局的位置对象,节省时间。 该方案弊端:耗电,每隔一定时间自动刷新位置,对电量的消耗比较大。

    方案2:按需定位,每次请求前都进行定位。这样做的好处是比较省电,而且节省资源,但是请求时间会变得相对较长。


    这个系列很多都是总结归纳与互联网,如有冒犯及时通知然后下线。目的只是为了更好地方便面试。谢谢!




    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值