2013 Android面试精华总结

来源:互联网 发布:php框架开发视频教程 编辑:程序博客网 时间:2024/04/20 04:10

HashMap与HashTable区别?

点评:HashMap基于Hashtable实现,不同之处在于HashMap是非同步的,并且允许null,即null value和null key,Hashtable则不允许null。

此外,记住一点:hashmap/hashset等凡是带有hash字眼的均基于hashtable实现,没带hash字眼的如set/map均是基于红黑树实现,前者无序,后者有序。

 

1.  谈谈你所了解线程同步的方法,并做详细介绍。

线程的同步是保证多线程安全访问竞争资源的一种手段。有两种方法可以实现线程同步,同方法和同步块。

同步方法:public synchronized 数据返回类型 方法名(){}

同步块:synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。

 

2.  android的布局方式有哪些,有哪些区别。

LinearLayout , RelativeLayout , TableLayout ,FrameLayout , AbsoluteLayout

线性布局:是我们应用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型。

 表格布局:以行列的形式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每加入一个控件即相当于添加了一列。

相对布局:是针对不同手机屏幕自动适应的一种非常好的布局。系统可以根据屏幕大小自动调整各组件之间的距离和位置。

帧布局中:每一个组件都代表一个画面,默认以屏幕左上角作为(0,0)坐标,组件按定义的先后顺序一次逐屏显示,后面出现的会覆盖前面的画面。

绝对布局:是用坐标来指定每一个控件的位置,这样的方法在直接拖控件的时候显的比较方便,但是不利于程序的推广和后期的调整。

 

3.  用你认为最优的排序算法对整形数组进行排序。

 

4.  用线程的方式实现,activity界面时间的实时更新。

Handler / AsyncTask  /  Runnable /  view.post / Acivity.post

5.  谈谈java的垃圾回收机制。

GC是GabageCollection 的缩写。中文意思就是垃圾回收。

Java由C++发展而来,在C/C++中,需要程序员自己来释放无用变量的内存空间,这样非常繁琐,程序员也可能忘记释放或者释放了不该释放的内存。同时也会耗费程序员大量精力在释放内存上。所以,Java就对此做了改进,由系统来管理内存的释放,不再由程序员去人工释放内存空间了。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间,如果程序员显示地调用System.gc(),可以通知虚拟机加快垃圾回收的速度。但并不能控制垃圾回收。

 

6.  谈谈你对多线程的理解。

Java支持多线程编程,他允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。

线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,由是和所属进程中的其它线程共享一个存储空间。

主线程可以拥有多个子线程,每个子线程还以拥有自己的子线程,这样就形成了多线程。由于多个线程往往会访问同一块内存区域,频繁的访问可能会产生线程的冲突,造成数据的损坏。于是就出现了线程同步。线程同步有同步方法和同步块。

7.  说说对数据结构的了解,谈谈对2叉树的理解。

1).线性结构;

2).树型结构;

3).图结构或网结构.

 

8.  死锁产生的原因及条件?

导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。

产生死锁的条件有四个:

1.互斥:所谓互斥就是进程在某一时间内独占资源。

2.请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3.不剥夺:进程已获得资源,在末使用完之前,不能强行剥夺。

4.循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。

9.  对android动画的理解。

Android当中有两种动画,逐帧动画和补间动画。

逐帧动画:就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。

补间动画:给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。

新的SDK新增了一种动画,叫Property动画。这种动画更改的是组件的实际属性,旋转,不再是形状的改变,他的位置左边也会随之改变。

 

10.值传递和引用传递有啥区别?

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

11.堆栈的区别?

数据结构的角度:栈,存取速度比堆要快,仅次于cup寄存器。但是存在栈中的数据大小和生存期必须是确定点的,缺乏灵活性。栈数据可以共享。栈是有序存放,先进后出的原则。堆,可以动态地分配内存大小,生存期不必事先告诉编译器,java的垃圾收集器会自动收走这些不再使用的数据。但是,由于要在运行时期动态分配内存,存取速度较慢。

Java的角度:堆中放对象,栈中放引用变量。堆空间是一个无序的空间,栈是先进后出的结构。

 

 

12.Android线程中要更新界面,有几种方法?请分别写出更新方法代码。

(1)Hanlder异步更新

(2)service动态更新

(3)AsynvTask

(4)View.post

13.写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z。要求用线程间的通信。

注:分别给俩个对象构造一个对象O,数字每打印两个或字母每打印一个就执行O.wait().

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. publicclass ThreadDemo   
  2.   
  3. {   
  4.   
  5.     // 测试    
  6.   
  7.     public static void main(String[] args) throwsException   
  8.   
  9.     {   
  10.   
  11.         Object obj = new Object();   
  12.   
  13.         // 启动两个线程    
  14.   
  15.         Thread1 t1 = new Thread1(obj);   
  16.   
  17.            
  18.   
  19.         Thread2 t2 = new Thread2(obj);   
  20.   
  21.            
  22.   
  23.         t1.start();   
  24.   
  25.         t2.start();   
  26.   
  27.     }   
  28.   
  29.        
  30.   
  31. }   
  32.   
  33.    
  34.   
  35. // 一个线程打印1-52    
  36.   
  37. classThread1 extends Thread   
  38.   
  39. {   
  40.   
  41.     private Object obj;   
  42.   
  43.        
  44.   
  45.     public Thread1(Object obj)   
  46.   
  47.     {   
  48.   
  49.         this.obj = obj;   
  50.   
  51.     }   
  52.   
  53.     public void run()   
  54.   
  55.     {   
  56.   
  57.         synchronized (obj)   
  58.   
  59.         {   
  60.   
  61.             // 打印1-52    
  62.   
  63.             for (int i = 1; i < 53;i++)   
  64.   
  65.             {   
  66.   
  67.                 System.out.print(i + "");   
  68.   
  69.                 if (i % 2 == 0)   
  70.   
  71.                 {   
  72.   
  73.                     // 不能忘了 唤醒其它线程    
  74.   
  75.                     obj.notifyAll();   
  76.   
  77.                     try   
  78.   
  79.                     {   
  80.   
  81.                         obj.wait();   
  82.   
  83.                     }   
  84.   
  85.                     catch (InterruptedExceptione)   
  86.   
  87.                     {   
  88.   
  89.                        e.printStackTrace();   
  90.   
  91.                     }   
  92.                 }   
  93.             }   
  94.         }          
  95.     }   
  96. }   
  97. // 另一个线程打印字母A-Z    
  98.   
  99. classThread2 extends Thread   
  100.   
  101. {   
  102.   
  103.     private Object obj;   
  104.   
  105.     public Thread2(Object obj)   
  106.     {   
  107.         this.obj = obj;   
  108.     }   
  109.     public void run()   
  110.     {   
  111.         synchronized (obj)   
  112.         {   
  113.             // 打印A-Z    
  114.             for (int i = 0; i < 26;i++)   
  115.             {   
  116.                 System.out.print((char)('A' +i) + " ");   
  117.                 // 不能忘了 唤醒其它线程    
  118.                 obj.notifyAll();   
  119.                 try   
  120.                 {   
  121.                     // 最后一个就不要等了    
  122.                     if (i != 25)   
  123.                     {   
  124.                         obj.wait();   
  125.                     }   
  126.                 }   
  127.                 catch (InterruptedExceptione)   
  128.                 {   
  129.                     e.printStackTrace();   
  130.                 }                  
  131.             }            
  132.         }   
  133.     }   
  134. }  
  135.   
  136.    


 

14.main方法执行完后,求count多的值。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. publicclass Test {  
  2.   
  3.    private static int count=0;  
  4.   
  5.    public Test(){  
  6.   
  7.        count++;  
  8.   
  9.        System.out.println("12");  
  10.    }  
  11.   
  12.    static{  
  13.   
  14.        count++;  
  15.   
  16.        System.out.println("1");  
  17.   
  18.    }  
  19.   
  20.    public static void main(String[] args) {  
  21.   
  22.        Test t1 = new Test();  
  23.   
  24.        Test t2 = new Test();  
  25.   
  26.        System.out.println(count);  
  27.    }  
  28. }  


 

15. 说说你对Activity的认识?

(2)Activity是android系统中四大组件之一,是一个可见的空间,是系统和用户交互的载体。

(2)Activity的 布局:每个activity都有其自身的布局,一般通过调用res/layout 下的 .xml文件来实现。

(3)Activity的生命周期

16.Activity的生命周期?

activity主要生命周期的方法说明:

onCreate():创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!

onStart():activity变为在屏幕上对用户可见时调用。

onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。

onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!

onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。

onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。

onDestroy():activity被完全从系统内存中移除时调用,该方法被调用。

 

17. 两个Activity之间的传参有哪些方式,各有什么区别?

(1)Intent传递参数,有两种方式,一种的intent传递bundle对象,bundle对象封装需要传递的数据。另一种方式,利用intent的putExtra()方法,传参。在取数据的时候,可以用getIntent()得到Intent对象,intent.getStringExtra()得到数据;getExtras()得到bundle对象,bundle.getString()可以得到数据。

(2)利用startActivityForResult()启动Activity,调用onActivityResult()得到数据。

18. 销毁所有Activity的方式?

把所有Activity记录下来,在需要退出程序的时候,关闭每一个Activity

 

19.intent-filter

20. 百度地图定位用到哪些类?

        BMapManager,MapView,LocationListener,GetPoint, LocationData

1. LocationClient 百度地图定位的核心类

2. LocationClientOption 设置定位方式(启用缓存定位、打开GPS、是否获取地理信息、设置坐标类型、间隔时间、设置PIO)

3. BDLocation (获取经纬度,精度,PIO信息,定位结果)

4. BDLocationListener接口类 (监听定位结果,获取定位结果,获取POI信息。)

5. BDNotifyListener (位置提醒接口类,用于设定位置提醒点,以及实现监听函数。)

6. GeofenceClient

6.1 GeofenceClient构造类

6.2GeofenceClient.OnGeofenceTriggerListener

6.3GeofenceClient.OnAddBDGeofencesResultListener

6.4 GeofenceClient.OnRemoveBDGeofencesResultListener

6.5注册进入围栏的监听

6.6开启/关闭围栏服务

6.7请求添加围栏及删除围栏

7. BDGeofence

7.1 BDGeofence构造类

7.2设置参数

8. BDLocationSatusCodes

21. 百度地图定位的原理?

         使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。

用户可以设置满足自身需求的定位依据:

若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

原理:LBS发送定位请求,百度定位SDK接收请求,根据定位依据访问定位服务器,定位服务器把定位结果返回给定位SDK,定位SDK再把定位结果返回给LBS客户端。

百度地图定位的功能:

  • 定位功能:通过GPS、网络定位(WIFI、基站)混合定位模式,返回当前所处的位置信息
  • 反地理编码功能:解析当前所处的位置坐标,获得详细的地址描述信息。
  • 地理围栏:通过定位SDK提供的定位服务和地理围栏服务,轻松实现基于位置提醒的各种服务

2013年9月22日 Android SDK:V2.2.0产品上线

新增:

  • 新增图片图层(方法:GroundOverlay、方法:Ground)
  • 升级LBS云检索
  • 定位三态效果(类:MyLocationOverlay 新增方法:setLocationMode)
  • 新增比例尺控件(类:MapView 新增方法:showScaleControl、setScaleControlPosition)
  • 新增实时监听地图状态的接口(新增接口:MKMapStatusChangeListener)
  • 映射地图中心点(通过接口自定义地图中心点映射在屏幕上的位置,类:MapController 新增方法:setCenterToPixel)
    中心点:即地图缩放、旋转等操作的基准点
  • 新增地图手势控制接口(以双指触控屏幕的中心点为基准,对地图进行缩放和旋转操作。默认为以地图中心点为基准进行操作)
  • 新增地图状态设置接口(可同时设置地图等级、地图中心点、旋转角度等)

修复:

  • 修复ItemizedOverlay可重复添加同一个Item的bug

22.Hanlder、Message Quene、Looper、Message的关系?

     Message是线程间通讯的消息载体,里面可以存放任何你想要传递的消息。Handler是Message的主要处理者,负责Message的发送,Message内容的执行处理。 MessageQueue消息队列,是专门用于装载Message的容器,存放通过Handler发布的消息,按照先进先出的原则执行。 每个Message queue都会有一个对应的Handler。 Looper是每条线程里的MessageQueue的管家,用于管理MessageQueue和消息循环。它负责阻塞读取MessageQueue中的信息 ,并把这个Message分发给对应的Handler去执行。在Handler处理完该Message 后,Looper则设置该Message为NULL,以便回收。

     它们四者之间的关系是,在其他线程中调用Handler.sendMsg()方法(参数是Message对象),将Message添加到Main线程的MessageQueue中,Main线程通过Looper从消息队列中取出Handler发过来的这个消息时,会回调Handler的handlerMessage()方法。

 

23.什么是MVC,你是怎么理解的。

答:

 

24.使用MVC有什么好处

(1)视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。

(2)较低的生命周期成本,MVC使降低开发和维护用户接口的技术含量成为可能。

(3)使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

(4)可维护性,分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

(5)有利于软件工程化管理,由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

 

25.你对面向对象是怎么理解的(不要背概念)它有什么好处?

答:基于对象的编程更符合人的思维模式,使人们更容易编写程序。 

提供了软件复用性的可能

26.在以前你的项目中,你用面向对象解决问题的例子?

答:

 

27.listview在设置Baseadapter时,在BaseAdapter的子类中,如何处理listview现实的每条item的重用;

答:在getView中充分利用contentView

 

28.使用游标Cursor来显示数据的时候,例如使用listview来加载adapter,数据更新,或者不再用该数据时,应该怎么处理Cursor;

 

29.IntentService和Service的区别

            IntentService是service的子类。Service不是一个单独的进程,也不是一个线程,因此不能再service里面做一些耗时操作。

       IntentService使用队列的方式将请求的Intent加入队列,然后开启一个workerthread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,可以做耗时的操作。

 

30.Activity的四种加载模式

1)standard:系统的默认模式,一次跳转即会生成一个新的实例。

2)singleTop:singleTop 跟standard 模式比较类似。如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。

3)singleTask: singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多activity开发中,经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。

4)singleInstance:设置为 singleInstance 模式的 activity 将独占一个task,独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。

31.如何使用广播接收器来监听广播

 

32.如何实现Activity和Service之间的通信,Service的生命周期,如果当前Service存活,那么再次调用startService时,Service会执行什么方法;

StartService()、bindService()。再次调用startService会执行startCommand()

 

33.AsyncTask有几个回调方法,如果AsyncTask在执行下怎么通知主线程进度更新。

(1) AsyncTask是使用java.util.concurrent框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试.这说明AsyncTask的设计很好的解决了匿名线程存在的问题。

(2)他有4个回调方法。分别是,

onPreExecute() ,当任务执行之前开始调用此方法,可以在这里显示进度对话框。doInBackground(Params...),此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。 

onProgressUpdate(Progress...) ,此方法在主线程执行,用于显示任务执行的进度。

onPostExecute(Result),此方法在主线程执行,任务执行的结果作为此方法的参数返回。

(3)AsyncTask在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。

 

34.如何捕获运行期异常?

答:(一) java当中捕获运行期异常可以使用Thread.UncaughtExceptionHandler接口。它是针对线程而言,Thread提供了4个相关方法。

 setUncaughtExceptionHandler(),为一个线程设置一个Handler;

 getUncaughtExceptionHandler(),获取handler; 

setDefaultUncaughtExceptionHandler(),为一个线程设置一个默认的Handler,在程序不能捕获而退出,并且么有其他的handler时被调用;

getDefaultUncaughtExceptionHandler();

(二) android当中大量使用线程,为了统一,可以再主线程中进行捕获。在oncreate()方法里设置,

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){

        public voiduncaughtException(Thread thread, Throwable ex) {

System.out.println(ex.getLocalizedMessage());

finish();

}

});

 

35.如果要显示大量的图片,怎么处理。具体的思路,会遇到的问题?

(1)压缩图片,BitmapFactory.Options,inSampleSize=4…原图的十六分之一

(2)及时回收Bitmap

(3)网上说使用弱引用

(4) HandlerThread(异步加载)+LruCache(内存缓存)+DiskLruCache(硬盘缓存)

36. webView的使用?

(1)在Activity生成一个WebView组件,并配置网络权限。

(2)如果有javaScript,需要WebView 的一个辅助类WebSettings来设置webView支持javaScript

3)如果点击页面链接继续在当前浏览器显示,而非启动系统浏览器,需要覆盖WebViewWebViewClient对象。

4)如果不做任何处理,浏览网页时点击系统返回键,整个浏览器会调用finish()结束自身,如果不希望退出当前浏览器,需要在当前activity处理并销毁返回事件。

webView是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面。

LoadUrl直接显示网页内容(单独显示网络图片)

LoadData显示中文网页内容(含空格的处理)

loadDataWithBaseURL()解析网页

WebView组件有一个辅助类叫WebSettings,它管理WebView的设置状态。该对象可以通过WebView.getSettings()方法获得。

 

37.webService的使用?

1指定webservice的命名空间和调用的方法名

2)设置调用方法的参数值,如果没有参数,可以省略

3生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述

4创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebServiceWSDL文档的URL

(5)使用call方法调用WebService方法

6)使用getResponse方法获得WebService方法的返回结果

 

38.怎么监听所有Activity的返回键事件。

(在父类中监听处理,所有Activity都继承他。就行)

 

39 如何解决线程中的死锁问题?

       首先看看什么是死锁?

假如线程 “A”获得了刀,而线程“B”获得了叉。线程“A”就会进入阻塞状态来等待获得叉,而线程“B”则阻塞来等待“A”所拥有的刀。这只是人为设计的例子,但尽管在运行时很难探测到,这类情况却时常发生。

解决方案:

(1)按顺序获取资源:要避免发生死锁,应该使用同一个顺序进行加锁。每个锁均带有一个序号。

(2)避免占有并等待:

(3) 让所有的线程按照同样的顺序获得一组锁。这种方法消除了两个线程分别等待对方的资源的问题。将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。

40. 如何及时回收Android中Bitmap的内存?

     (1)bitmap.recycle()方法用于回收该Bitmap所占用的内存。

     (2)接着将bitmap置空。

   (3)最后使用System.gc()调用一下系统的垃圾回收器进行回收,可以通知垃圾回收器尽快进行回收。这里需要注意的是,调用System.gc()并不能保证立即开始进行回收过程,而只是为了加快回收的到来。

   (4)如果代码已经不再需要使用Bitmap对象了,就可以释 放内存了。释放内存以后,就不能再使用该Bitmap对象了,如果再次使用,就会抛出异常。所以一定要保证不再使用的时候释放。比如,如果是在某个Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中进行回收。

50 android 三种通信方式:

      Java.net.*,java标准接口

       Android.net.*,Android网络接口

       Org.Apache接口

 

51.多线程,利用线程池提高性能?

为什么要用多线程?

(1)  提高用户体验性,避免应用程序没有响应(ANR)。

(2)  异步任务处理。

(3)  多任务,多线程下载。

为什么多线程可以提高用户体验性,或是避免ANR?

(1)  Android系统为了防止应用程序反应较慢导致系统无法正常运行做了一个处理,一种情况是当用户输入事件在5秒内无法得到响应,那么系统会弹出ANR对话框,另一种情况是BroadcastReciever 超过10秒没执行完也会弹出ANR对话框。不能再主线程做耗时操作。

(2)   事件处理的原则:所有可能耗时的操作都放到其他线程去处理。

如何实现线程间通讯?

(1)使用AsyncTask
     AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行。

(2)使用Handler。

(3) Activity.runOnUiThread(Runnable)

(4) View.post(Runnable)

    View.postDelayed(Runnable, long)

(4)  Handler.post

Handler.postDelayed(Runnable,long)

 

52.Android中网络通信的方式?

(1)针对TCP/IP的Socket、ServerSocket

(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。

(3)针对直接URL的HttpURLConnection。

(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。

(5)使用WebService。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice。

(6)直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。

 

53.说说你对tcp/ip、http、socket之间的区别?

(1)  网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,socket则是对TCP/IP协议的封装和应用,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。TCP/IP协议有四层,数据链路层、网络接口层、传输层和应用层。

(2)Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象。

(3)实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,它只是提供了一个针对TCP或者UDP编程的接口。

 

54.UTF-8,GBK,GB2312之间的区别?

(1)UTF-8是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。

(2)GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312支持的汉字太少。

(3)GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。 

55.http的工作原理?

(1)HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

(2)HTTP协议是无状态的(stateless)。也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨不同的客户端。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。

 

56.Android移动客户端如何访问服务器?

(1)使用URL访问网络,使用URLConnection提交请求,HttpPost对象的主要作用是将Android端手机数据提交给Web应用服务器,在发送服务器之前对数据进行编码,提交HttpPost对象,获取服务器HttpResponse响应数据解码,得到数据。

(2)使用http访问网络

(3)使用webView访问网络

(4)使用webservice访问网络

 

57.Android中有没有内存泄露,你遇到过没有,怎么解决?它和内存溢出又有什么区别?

Android当中会出内存泄露,也会出现内存溢出。

内存泄露:是指没有及时清理内存垃圾,分配出去的内存无法回收了,导致系统无法再给你提供内存资源,由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

 

  出现内存泄露的情况:

(1)   查询数据库时,Cursor没有关闭造成资源浪费。

(2)   Bitmap没有使用是采用recylce()及时回收,释放内存。

(3)   构造Adapter时,没有充分使用contentView,而是创建View。

(4)   引用导致内存泄露。

解决方案:

(1)  Activity中的对象的生命周期不能大于Activity,不要在context-activity里保存长生命周期的引用,用Application context来代替context-activity。

(2)   构造Adapter时,充分使用contentView,尽量减少创建View对象,可以使用静态类来处理优化getView()过程。

(3)   Bitmap对象不使用时及时回收。

(4)   操作数据库时,注意关闭游标。

(5)   能用局部变量的尽量使用局部变量,绝不把局部变量作为成员变量来使用。

如何避免内存泄露?

1)   BraodcastReceiver,ContentObserver,FileObserver在Activity onDeatory或者某类声明周期结束之后一定要unregister掉(取消注册),否则这个Activity/类会被system强引用,不会被内存回收。

2) 不要直接对Activity进行直接引用作为成员变量,如果不得不这么做,请用弱引用privateWeakReference<Activity> mActivity来做。

3)   很多内存泄露是由于循环引用造成的,比如a中包含了b,b包含了c,c又包含a,这样只要一个对象存在其他肯定会一直常驻内存,这要从逻辑上来分析是否需要这样的设计。

 

内存溢出:内存溢出是指程序要求的内存,超出了系统所能分配的范围,从而发生溢出

内存溢是指在一个域中输入的数据超过它的要求而且没有对此作出处理引发的数据溢出问题,多余的数据就可以作为指令在计算机上运行。

解决方案:

(1)   等比例缩小图片  。

(2)   对图片采用软引用,及时地进行recyle()操作。

(3)   对复杂的listview进行合理设计与编码:充分利用Adapter里面的 convertView 。

(4)   在页面切换时尽可能少地重复使用一些代码,比如:重复调用数据库,反复使用某些对象。

(5)  页面布局当中有没有大的图片,比如背景图之类的。去除xml中相关设置,改在程序中设置背景图。

(6)  在内存引用上做些处理,常用的有软引用、强化引用、弱引用。

 

54.ListView的优化

55.线程的异步怎么实现实现

56.Activity生命周期

57.handler机制

58.推送机制

要获取服务器上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。

虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is better than  pull。因为Pull方式更费客户端的网络流量,更主要的是费电量。

Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用 程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些 消息。

MQTT协议实现Android推送

RSMB实现推送(ReallySmall Message Broker

XMPP协议实现Android推送

59.屏幕翻转调用Activity的什么方法

60.地图

61.ImageView加载gif图片不能显示完,只会显示第一帧,怎么解决这个问题

利用Movie类加载gif图片,并绘制出来。自定view,绘制gif图片。

62.ListView中ArrayAdapter和类似的Adapter如何巧妙地利用?

63.用代码实现多态机制?

64.int数组实现升序排列?

65.项目组要实现一个控件,这个控件当中有一个按钮和文本输入框;如何实现这个控件?如果你已经实现了这个控件,在代码中如何给这个控件添加事件监听?

66.json和xml的区别?

xml是一种允许用户对自己的标记语言进行定义的源语言。格式统一,跨平台和语言,

json一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。

(1).可读性方面。

JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。

(2).可扩展性方面。

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3).编码难度方面。

XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

(4).解码难度方面。

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5).流行度方面。

XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6).解析手段方面。

JSON和XML同样拥有丰富的解析手段。

(7).数据体积方面。

JSON相对于XML来讲,数据的体积小,传递的速度更快些。

(8).数据交互方面。

JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。

(9).数据描述方面。

JSON对数据的描述性比XML较差。

(10).传输速度方面。

JSON的速度要远远快于XML。

67.排序算法有哪几种?

冒泡排序、选择排序、插入排序、快速排序

68.写个单例模式?

69.火星坐标?

地球坐标:指WGS84坐标系统
火星坐标:指使用国家保密插件人为偏移后的坐标
地球地图:指与地球坐标对应的客观真实的地图
火星地图:指经过加密偏移后的,与火星坐标对应的地图

70.gps定位为什么有偏差?

·        星历误差—予报的卫星位置的误差; .

·        卫星钟差—予报的卫星钟差,包括SA; 

·        电离层误差—由于电离层效应引起的观测值的误差; 

·        对流层误差—由于对流层效应引起的观测值的误差; 

·        多径误差—由于反射信号进入接收机天线引起的观测值的误差; 

·        接收机误差—由于热噪声、软件和各通道之间的偏差引起的观测值误差。

 

71.TCP和UDP的区别?

TCP是可靠的双向流协议,通过三次握手机制,保证数据完整性,如果数据中途丢失会要求重新发送。UDP是不可靠的数据报协议。数据丢失不会要求重新发送,最大的优点就是速度快。

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它 们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

72.SVN和git的区别?

1.GIT是分布式的,SVN不是。

2.GIT把内容按元数据方式存储,而SVN是按文件。

3.GIT分支和SVN的分支不同。

4.GIT没有一个全局的版本号,而SVN有。

5.GIT的内容完整性要优于SVN。


73 异步任务实现机制?

74 两个一维数组和一个二维数组,哪个占用资源更多?

75 垃圾回收机制的原理?

76 ListView内部实现机制?

77 呼吸效果,怎么做,说下思路?

78 android中线程间,进程间如何通讯?

79 Activity的生命周期?

80 Service是什么?如何启动和停止Service?、

81 android中XML解析要用到哪些类?解析的原理?

82 显示大量图片,如何做内存管理?

异步加载+内存缓存+本地缓存
0 0
原创粉丝点击