蓝少泽

天生我材必有用,千金散去还复来。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
2013-5-2号补充:
1.View和ViewGroup的关系
Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等对待。ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup。

2.如何定位和解决Andorid的内存溢出问题


3.一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组。(要求时间复杂度是O(n))
public class a { 
public static void main(String args[]) {
int a[]={84,40,16,3,10,49,28,76,94,70};
int n;
int min=a[0];
int i;
int max=a[0];
for(n=0;n<=9;n++) {
if(max<a[n])
max=a[n];
}
for(i=0;i<=9;i++) {
if(min>a[i])
  min=a[i]; 
}
System.out.print("max="+max);
System.out.print("min="+min);
}
}
 

4.用Java代码实现判断一个字符串中是否包含另一个字符串,不要用jdk中String的indexOf方法。
boolean a = s.contains("??");


5.用Java实现一个Singleton.
publci class MyClass{
 
          private MyClass(){} 
          public static class SingleTon{
 
               public static MyClass instance = new MyClass();
         }
 
          public static MyClass getInstance(){
          return SingleTon.instance;
       }
 
}

6.简述Observer设计模式,并画出Observer模式的典型结构类图
 

观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

 
 

7.& 和&&的区别
&和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件语句执行完为止。
 
8.什么是dpi,px,sp?适配是如何做的,为什么?

9.用最有效率的方法算出2乘以8等于几?
 
    2<<3

10.静态成员类、非静态成员类有什么区别?什么是匿名内部类?
 
类的静态成员每个类只有一个,非静态成员每个对象一个。

11.Handler机制的原理,内部是如何实现的,消息队列的实现机制?
     andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
 
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。 
 

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。 

 

1.Handler创建消息

        每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。

 

 

 

2.Handler发送消息

UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。

Handler、Looper、MessageQueue的初始化流程如图所示:

Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

 

3.Handler处理消息

UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所示。

 
 
 
 

12.什么是ANR,如何定位和避免?


13.APK之间互相传递数据
  通过AnroidManifest中设置shareUserId

14.简述Android的启动过程


15.如何加载ndk库?如何在jni中注册native函数,有几种注册方法?

RegisterNatives 注册
16.如何收集软件崩溃信息?


17.简述软件编译流程和发布流程


18.是否编译过android源码和linux内核源码


19.写一个归并排序数组
  1. public class MergeSortTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };  
  5.         print(data);  
  6.         mergeSort(data);  
  7.         System.out.println("排序后的数组:");  
  8.         print(data);  
  9.     }  
  10.   
  11.     public static void mergeSort(int[] data) {  
  12.         sort(data, 0, data.length - 1);  
  13.     }  
  14.   
  15.     public static void sort(int[] data, int left, int right) {  
  16.         if (left >= right)  
  17.             return;  
  18.         // 找出中间索引  
  19.         int center = (left + right) / 2;  
  20.         // 对左边数组进行递归  
  21.         sort(data, left, center);  
  22.         // 对右边数组进行递归  
  23.         sort(data, center + 1, right);  
  24.         // 合并  
  25.         merge(data, left, center, right);  
  26.         print(data);  
  27.     }  
  28.   
  29.     /** 
  30.      * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序 
  31.      *  
  32.      * @param data 
  33.      *            数组对象 
  34.      * @param left 
  35.      *            左数组的第一个元素的索引 
  36.      * @param center 
  37.      *            左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 
  38.      * @param right 
  39.      *            右数组最后一个元素的索引 
  40.      */  
  41.     public static void merge(int[] data, int left, int center, int right) {  
  42.         // 临时数组  
  43.         int[] tmpArr = new int[data.length];  
  44.         // 右数组第一个元素索引  
  45.         int mid = center + 1;  
  46.         // third 记录临时数组的索引  
  47.         int third = left;  
  48.         // 缓存左数组第一个元素的索引  
  49.         int tmp = left;  
  50.         while (left <= center && mid <= right) {  
  51.             // 从两个数组中取出最小的放入临时数组  
  52.             if (data[left] <= data[mid]) {  
  53.                 tmpArr[third++] = data[left++];  
  54.             } else {  
  55.                 tmpArr[third++] = data[mid++];  
  56.             }  
  57.         }  
  58.         // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)  
  59.         while (mid <= right) {  
  60.             tmpArr[third++] = data[mid++];  
  61.         }  
  62.         while (left <= center) {  
  63.             tmpArr[third++] = data[left++];  
  64.         }  
  65.         // 将临时数组中的内容拷贝回原数组中  
  66.         // (原left-right范围的内容被复制回原数组)  
  67.         while (tmp <= right) {  
  68.             data[tmp] = tmpArr[tmp++];  
  69.         }  
  70.     }  
  71.   
  72.     public static void print(int[] data) {  
  73.         for (int i = 0; i < data.length; i++) {  
  74.             System.out.print(data[i] + "\t");  
  75.         }  
  76.         System.out.println();  
  77.     }  
  78.   
  79. }  
 

20.自定义控件相关


21.缓存实现


22.线程同步(生产者 消费者)


23.符号匹配(栈)


24.还问了下拉刷新和分页加载的实现机制
 
<—————————>
《国际化产品部   ES团队》
25.Handler 与 Looper的关系? 消息队列原理?
26.android的启动过程
27.ListView优化方式?
28.imageLoader原理?
29.两个应用之间,A ——》B——》A,根据Activity启动模式,分别说一下现象。
30.说说你做的这些App中,遇到的问题和收获?
31.ListView 优化,如何做到快速滑动列表,图片也随着加载,并且不卡顿?
32.java的GC机制。
33.说一下rgb_565与rgb_8888
<——————>
posted on 2015-09-15 16:41  蓝少泽  阅读(186)  评论(0编辑  收藏  举报