Android面试题3

版权声明:个人见解,希望可以帮助大家,共同进步. https://blog.csdn.net/weixin_40783315/article/details/83783881

41.MVC作用?

答: Android中界面部分也采用了当前比较流行的MVC框架

在Android中:

1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方

便的引入。也可以使用JavaScript+HTML等的方式作为View层,通过WebView组

件加载,同时可以实现Java和JavaScript之间的通信。     

2) 控制层(Controller):这句话也就暗含了不要在Acitivity中写代码,要通过Activity

交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响

应时间是5s,如果耗时的操作放在这里,Android的控制层的重任通常落在了众多

的Acitvity的肩上,程序就很容易被回收掉。

  1. 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,

当然对业务计算等操作也是必须放在的该层的。
      在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。

42.px,dp,sp区别?

px:

即像素,1px代表屏幕上一个物理的像素点;

px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同

dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

sp:

与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

43.android 系统架构,按顺序?

答:1)应用程序层   java语言  应用程序开发

  1. 应用程序框架层  java语言  OS定制  framework层开发
  2. 系统运行库层   C C++ 实现  so库
  3. Linux内核层

44.android有几种布局,有什么特点?

答:最常用的布局有以下这几种:

第一种:帧布局(框架布局)FrameLayout,在这个布局中,所有的子元素统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。

第二种:线性布局LinearLayout,最常用的一种布局方式,所有子控件的对齐方式,取决于如何定义 orientation的属性:vertical   垂直方向 ,如果按照这种方向所有的子控件将按照垂直的方式分布在布局上,每行只允许有一个子元素,horizontal水平方向 ,这时子控件将会以水平的方向分布在布局中。

第三种:绝对布局AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。

第四种:相对布局RelativeLayout,允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试。

第五种:表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象,TableRow里每放一个元素就是一列,总列数由列数最多的那一行决定。

第六种:网格布局 GridLayout,在Android 4.0中,新引入的GridLayout网格布局,GridLayout布局使用虚细线将布局划分为行,列和单元格,也支持一个控件在行,列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。

 

(Android 4.0的SDK已经发布,在众多的新增特性中,其中对开发者来说比较重要的特性之一,是新增的两种界面布局方式:Space和Gridlayout)

45.常用的设计模式?

答:单例模式;工厂模式;

观察者模式:ContentObserver, 监听ContentProvider  ContentResolver;

适配器模式Adapter(SimpleAdapter  BaseAdapter  ArrayAdapter CursorAdapter)以及各种Adapter的数据源;

代理模式   AOP;

46.常用的排序法?

答: 冒泡排序 O(n^2) : 冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元   素经过几次移动,会最终浮到水面上。

快速排序O(n log n)  : 快速排序采用的思想是分治思想。快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

插入排序 O(n^2) :将新来的元素按顺序放入一个已有的有序序列当中。

选择排序 O(n^2) :第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止。

47.写一个快速排序法?

for (int i = 0; i < num.length; i++) {      

// 内循环控制比较后移位      

for (int j = num.length-1; j > i ; j--) {      

                if (num[j-1]>num[j]) {      

                    temp = num[j-1];      

                    num[j-1] = num[j];      

                    num[j] = temp;      

                }      

            }   

 

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public class QuickSort {

    public static void main(String[] args) {

           Integer[] list={34,3,53,2,23,7,14,10};

       QuickSort qs= new QuickSort();

       qs.quick(list);

       for( int i=0;i<list. length;i++){

           System. out.print(list[i]+ " ");

       }

       System. out.println();

    }

  public void quick(Integer[] str) {

      if (str.length > 0) {    //查看数组是否为空

          _quickSort(str, 0, str. length - 1);  //从第一个数到最后一个数

      }

  }

  public void _quickSort(Integer[] list, int low, int high) { //low,最小索引,high最高索引

      if (low < high) {

          int middle = getMiddle(list, low, high);  //将list数组进行一分为二 ,取得中间值对应的索引

          _quickSort(list, low, middle - 1);        //对低字表进行递归排序

          _quickSort(list, middle + 1, high);       //对高字表进行递归排序

      }

  }

  //获得数组的中间值的索引(即位置)(参数:数组,最低索引,最高索引)

    public int getMiddle(Integer[] list, int low, int high) {

        int tmp = list[low];    //先用数组的第一个值作为中轴(对比值)

        while (low < high) {

           //后一半的数组,把中值与最后一个比,如果不比它大则不交换则再与前一个再比

             while (low < high && list[high] > tmp) {

                high--;

             }              

             list[low] = list[high];   //最后list[high]小于对比值时,则把这个值移到低端------------>这里list[low]值发生了改变 ,为下面循环作准备            

             while (low < high && list[low] < tmp) { //前一半,中值与低端值比,如果比中值小则与下一个数比                  

                 low++; //修改索引为下一个数

            }

            list[high] = list[low];   //否则,如果list[low]比中轴大,则把这个值移到高端------------->这里list[high]值发生了改变

       }

  list[low] = tmp; //上面循环处理完后,把当前中轴值存到当前数组的低端(其实当前的low在上面处理完后,已逐渐修改为中间的索引)         

       System.out.println(low +"============"+tmp);

       return low;                   //返回中轴的位置

    }

}

48.synchronized 是什么?有什么用?

答:Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

     二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

     三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

     四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

     五、以上规则对其它对象锁同样适用.

49.线程的状态?

答:1)、新建状态(New):新创建了一个线程对象。

2)、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该 状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3)、运行状态(Running):就绪状态的线程获取了CPU,执行run()方法

4)、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运 行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用, (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时, 处理完毕时,线程重新转入就绪状态。

5)、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周 期。

当调用start方法的时候,该线程就进入就绪状态。等待CPU进行调度执行,此时还没有真正执行线程。

当调用run方法的时候,是已经被CPU进行调度,执行线程的主要任务。

50.onSaveInstanceState() 和 onRestoreInstanceState();

答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

51.了解版本控制的工具吗?

版本控制是程序开发、管理必不可少的工具,特别是在多人协作的团队中,适宜的版本控制工具可以提高开发效率,消除很多有代码版本带来的问题

目前最流行的开源版本控制工具要数Subvision(SVN)、Git以及Mercurial(hg)了,其中SVN是集中式版本控制工具,Git和Mercurial则是分布式的。

早期常用的还有CVS

52.github  git都是啥?

Github 是开源代码库以及版本控制系统

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理. 

53.git svn 区别?

git是国外开源版本库,不需要自己搭建服务器,你在上面搭建上传的工程代码都是公开的,谁都可以访问,可以设置团队成员分配修改的权限。

如果要像SVN一样指定的人可以访问Git就需要收费了,SVN需要你有一台服务器,上面安装SVN Server实现版本控制

54.举个简单的socket编程

服务器:

try {

ServerSocket server=new ServerSocket(8189);

Socket  socket=server.accept();

String line;

BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter os=new PrintWriter(socket.getOutputStream());

BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

System.out.println("客户端:"+is.readLine());

line=sin.readLine();

while(!line.equals("bye")){

os.println(line);

os.flush();

System.out.println("服务器:"+line);

System.out.println("客户端:"+is.readLine());

line=sin.readLine();

}

os.close();

is.close();

socket.close();

server.close();

} catch (IOException e) {

e.printStackTrace();

}

客户端:

try {

//向本机的8189端口发出客户请求

Socket socket=new Socket("127.0.0.1",8189);

//由系统标准输入设备构造BufferedReader对象

BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

//由Socket对象得到输出流,并构造PrintWriter对象

PrintWriter os=new PrintWriter(socket.getOutputStream());

//由Socket对象得到输入流,并构造相应的BufferedReader对象

BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

String readline;

readline=sin.readLine();//从系统标准输入读入字符串

while(!readline.equals("bye")){

//将从系统标准输入读入的字符串输出到Server

os.println(readline);

//并刷新输出流,使Server马上收到该字符串

os.flush();

System.out.println("客户端:"+readline);

//从Server读出字符串,并打印到标准输出设备上

System.out.println("服务器端:"+is.readLine());

readline=sin.readLine();

}

os.close();

is.close();

socket.close();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

 

55.怎样用数据库语句实现分页

一个不带limit 一个带limit。mysql为例首先,连接数据库,写一条sql语句把你要查询的信息总量查找出来sql =” select count(*) from tb”;

设定每页显示条数int display=20; 

然后,当前页为int page=1;

在写一句sql = “select * from tb limit “+dispaly*(page - 1)+”,”+display;

最后,在页面显示分页信息把当前页传回给分页处理页,一定要把相关的条件一起传回去,get方传值。

56.怎样实现自定义View

很多时候系统自带的View满足不了设计的要求,就需要自定义View控件。自定义View首先要实现一个继承自View的类。添加类的构造方法,override父类的方法,如onDraw,(onMeasure)等。如果自定义的View有自己的属性,需要在values下建立attrs.xml文件,在其中定义属性,同时代码也要做修改。

57.json的上限是多少(大小)

Json本身没有长度限制,对后台程序来讲,JSON就是一个字符串

如果文件过大的会变成String报错,这时改成流来做就可以了。

58.afinal框架和xUtils框架的区别

xUtils 与 afinal 目前的主要区别:

afinal 的View注解要继承FinalActivity, 如果要使用FragmentActivity或其他View自定义视图就要对已有代码进行较大的改造,耦合太强,非常不方便,而xUtils使用静态初始化方法。

 xUtils对http模块进行了较大的重构,支持大文件上传,支持7种http谓词,mutipart支持设置subType,下载支持302重定向...

59.listView上拉加载监听

OnScrollListener监听

在以下两个方法中做出判断和处理:

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// 计算最后可见条目的索引

lastVisibleIndex = firstVisibleItem + visibleItemCount - 1;

// 所有的条目已经和最大条数相等,则移除底部的View

if (totalItemCount == MaxDateNum + 1) {

mListView.removeFooterView(moreView);

}

}

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
     // 当不滚动时
     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
      //判断是否滚动到底部
      if (view.getLastVisiblePosition() == view.getCount() - 1) {
       adapter.count += 10;
                   adapter.notifyDataSetChanged();
                   int currentPage=adapter.count/10;
                   Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show();
      }
     }
    }

60.JSON/XML的区别

1.JSON和XML的数据可读性基本相同

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

3.JSON相对于XML来讲,数据的体积小

4.JSON与JavaScript的交互更加方便

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

6.JSON的速度要远远快于XML

 

猜你喜欢

转载自blog.csdn.net/weixin_40783315/article/details/83783881