转载

面试题之 Java 与 Android 基础 (一)

面试题之 Java 与 Android 基础 (一)

Java 创建线程方式

  • 继承Thread类创建线程类
  • 通过Runnable接口创建线程类
  • 通过Callable和Future创建线程:Callable -> FutureTask -> start -> get

前两种很常见,给出第三种的代码实现

public class CallableAndFuture {
    public static void main(String[] args) {
        Callable<Integer> callable = new Callable<Integer>() {
            public Integer call() throws Exception {
                return new Random().nextInt(100);
            }
        };
        FutureTask<Integer> future = new FutureTask<Integer>(callable);
        new Thread(future).start();
        try {
            Thread.sleep(5000);// 可能做一些事情
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

Java 中 wait 与 sleep 区别

  • wait

在调用完 bar.wait(); 的时候当前线程会释放对 bar 对象的锁,但是要离开该对象的监视器还要等 synchronized 代码块执行完毕

public void foo(){
    synchronized (bar){
        // 其它代码
        bar.wait();
        System.out.println("hello world");
        // 其他代码
    }
}
  • sleep

在一个线程中调用 sleep(long millis) 方法会导致该线程进入休眠状态,即该线程会停止运行 millis 毫秒的时间,但并不代表 millis 毫秒后该线程马上会运行,超时后该线程重新加入到等待队列等待虚拟机调度。

使用场景区别

wait 方法是为了 Reader 和 Writer 之间的协作而 sleep 方法仅仅是对本线程的操作。

Android 内存泄露场景

为什么出现内存泄漏:Java 的 GC 机制,从 ROOT 开始遍历,对象如果没有价值了就不会再被引用,然而没有价值的对象还被引用就会出现内存泄露。

  • 非静态内部类的静态实例:内部类默认持有外部类的引用,静态实例存在静态区中。
  • 非静态内部类实例: Hanlder 示例,在 Activity 销毁后,MessageQueue仍可能有未处理的消息,handler 仍然会被引用,handler 会引用应该销毁的 Activity。
  • 静态变量引入 Activity:常见单例中 Context。
  • Cursor, Bitmap, TypedArray, ListView, BroadcastReceiver、观察者模式 反注册

Android OOM

为什么会出现 OOM:Android 中每个 APP 最少运行在一个进程中, 每个进程或者每个虚拟机有个最大内存限制。APP内存由 dalvik内存 和 native内存 2部分组成,这2部分加起来不能超过android对单个进程,虚拟机的内存限制。

场景:

  • 无法 GC,堆中存有无用实例导致 OOM
  • 加载大图片

避免方式:

  • 回收:对不用的变量或 Bitmap 及时赋值为 null 与调用 recycle
  • 缓存:二级缓存(强引用+软引用)、LRUCache+SD
  • 避免频繁创建:StringBuilder, onDraw 等频繁调用的方法

Android ANR

为什么出现 ANR:Android 中主线程负责处理与用户交互的工作,如果在主线程中做了太多其它的工作(如数据处理),那么太久时间里主线程不能处理 UI 方面的工作,界面太久(5秒)没有更新,就会出现 ANR

场景:

  • 主线程中进行网络访问,文件读取,数据计算等耗时操作
  • 主线程被 IO 或其它(Thread.sleep, wait)阻塞太久

避免方法:

  • 异步处理耗时操作,并降低子线程的优先级
  • onCreate 与 onResume 中避免耗时代码
原文  http://navyblue.top/article/171
正文到此结束
Loading...