面试储备资料程序员android面试录

整理下最近Android面试的题目

2018-05-07  本文已影响44人  作死小强_G

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

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(结构型)因为不知道所以面试一般般了,继续努力!

上一篇下一篇

猜你喜欢

热点阅读