整理下最近Android面试的题目

作者: 作死小强_G | 来源:发表于2018-05-07 16:29 被阅读44次

    最近辞职了,在找工作这里整理记录下面试遇到的题目:

    2018/5/7

    1.Android中跨进程通讯的方式有哪些?

    Android中跨进程通讯的方式有网路、文件、广播、Aidl等;

    2.为什么在子线程中创建handler会抛出异常,正常怎么创建子线程Handler?

    在子线程中直接创建一个handler的时候会抛出 

     java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

    错误,这是因为没有调用线程Looper.perpare()方法去初始化Looper,所以Looper.myLooper对象是空的,需要调用perpare方法初始化Looper对象;

    正常创建可以在主线程创建:

    HandlerThread handlerThread = new HandlerThread("handlerThread-name");

    handlerThread.start();

    Handler handler = new Handler(handlerThread.getLooper());

    子线程中创建Handler:

    new Thread(new Runnable() {

        @Override

        public void run() {

            Looper.prepare();

            Handler handler1 =new Handler(Looper.myLooper());

            Looper.loop();

        }

    }).start();

    3.Android中的内存泄漏和优化?

    (1)单例导致内存泄露

            单例的生命周期和应用一样长,如果一个对象(activity、service等上下文)已经没有用处了,但是单例还持有它的引用,那么在整个应用程序的生命周期它都不能正常被回收,从而导致内存泄露。

    (2)静态变量导致内存泄露

            静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。

    (3)非静态内部类导致内存泄露

            非静态内部类(包括匿名内部类)默认就会持有外部类的引用,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄露。

    (4)未取消注册或回调导致内存泄露

             比如我们在Activity中注册广播,如果在Activity销毁后不取消注册,那么这个广播会一直存在系统中,同上面所说的非静态内部类一样持有Activity引用,导致内存泄露。因此注册广播后在Activity销毁后一定要取消注册。

    (5)Timer和TimerTask导致内存泄露

    (6)集合中对象未清理造成内存泄漏

             这个比较好理解,如果一个对象放入到ArrayList、HashMap等集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除,这样只要集合还在使用(而此对象已经无用了),这个对象就造成了内存泄露。并且如果集合被静态引用的话,集合里面那些没有用的对象更会造成内存泄露了。所以在使用集合时要及时将不用的对象从集合remove,或者clear集合,以避免内存泄漏。

    (7)资源未关闭或释放导致内存泄露

            在使用IO、File流或者Sqlite、Cursor等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露。

    (8)属性动画造成内存泄露

            动画同样是一个耗时任务,比如在Activity中启动了属性动画(ObjectAnimator),但是在销毁的时候,没有调用cancle方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去,动画引用所在的控件,所在的控件引用Activity,这就造成Activity无法正常释放。因此同样要在Activity销毁的时候cancel掉属性动画,避免发生内存泄漏。

    @Override

    protected void onDestroy(){

        super.onDestroy();

        mAnimator.cancel();

    }

    (9)WebView造成内存泄露

            关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。

    具体可以查看这里:Android内存优化——常见内存泄露及优化方案

    4.adapter实现的两种方法?

            这个问题看到的时候有点懵,因为平时间使用adapter的时候都是继承自BaseAdapter实现Adapter,可能他们想问的是这个问题

    设计模式(五)适配器模式Adapter(结构型)因为不知道所以面试一般般了,继续努力!

    相关文章

      网友评论

        本文标题:整理下最近Android面试的题目

        本文链接:https://www.haomeiwen.com/subject/aucvrftx.html