Android

1、简述Http请求和响应的组成部分

答:户端通过发送HTTP请求向服务器请求对资源的访问。

HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。

请求行以一个方法符号开头,后面跟着请求URI和协议的版本,以CRLF作为结尾。

请求行以空格分隔。除了作为结尾的CRLF外,不允许出现单独的CRLF字符

2、简述getpost的区别

答:(1get是从服务器上获取数据,post是向服务器传送数据。

1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。

2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

2)   GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

3、简述http建立连接的过程

答:当输入一个请求时,首先建立一个socket连接,因为socket是通过ip和端口建立的,所以,之前则还有一个DNS解析过程。如把www.baidu.com变成一个ip,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80

4、简述ANR和出现ANR的原因

答:1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕

5、简述HttpURLConnection中get和post的使用方式

答:1.通过调用URL对象openConnection()方法来创建URLConnection对象

2.设置URLConnection的参数和普通的请求属性

3.如果只是发送GET方式请求,使用connet方法建立和远程资源之间的实际连接即可;如果发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。

4.远程资源变为可用,程序可以访问远程资的头字段,或通过输入流读取远程资源的数据。

6、简述Handler的运行机制

答:当我们需要在子线程处理耗时的操作(例如访问网络,数据库的操作),而当耗时的操作完成后,需要更新UI,这就需要使用Handler来处理,因为子线程不能做更新UI的操作。Handler能帮我们很容易的把任务(在子线程处理)切换回它所在的线程。简单理解,Handler就是解决线程和线程之间的通信的。

7、简述AsyncTask使用时需要重写的方法及对应的意义

答:onPreExecute

表示该方法是运行在主线程中的。在AsyncTask执行了execute()方法后就会在UI线程上执行onPreExecute()方法,该方法在task真正执行前运行,我们通常可以在该方法中显示一个进度条,从而告知用户后台任务即将开始。

   doInBackground

表示该方法是运行在单独的工作线程中的,而不是运行在主线程中。doInBackground会在onPreExecute()方法执行完成后立即执行,该方法用于在工作线程中执行耗时任务,我们可以在该方法中编写我们需要在后台线程中运行的逻辑代码,由于是运行在工作线程中,所以该方法不会阻塞UI线程

8、简述HttpClient和HttpURLConnection的区别

答:HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了便捷的方法

9、简述HttpClient做网络请求的步骤

答:get请求1, 创建HttpClient对象

2,创建HttpGet对象,指定请求地址(带参数)

3,使用HttpClient的execute(),方法执行HttpGet请求,得到HttpResponse对象

4,调用HttpResponse的getStatusLine().getStatusCode()方法得到响应码

5,调用的HttpResponse的getEntity().getContent()得到输入流,获取服务端写回的数据

Post请求1,创建HttpClient对象

2,创建HttpPost对象,指定请求地址

3,创建List,用来装载参数

4,调用HttpPost对象的setEntity()方法,装入一个UrlEncodedFormEntity对象,携带之前封装好的参数

5,使用HttpClient的execute()方法执行HttpPost请求,得到HttpResponse对象

6, 调用HttpResponse的getStatusLine().getStatusCode()方法得到响应码

7, 调用的HttpResponse的getEntity().getContent()得到输入流,获取服务端写回的数据

10、简述http1.0和http1.0的区别

答:长连接:HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。

节约带宽:HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。

HOST域 :现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。

11、简述HttpUrlConnection和HttpClient的区别

答:HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了便捷的方法

12、简述TCP和UDP的区别

答:1.基于连接与无连接;

2.对系统资源的要求(TCP较多,UDP少);

3.UDP程序结构较简单;

4.流模式与数据报模式 ;

5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
13、简述Universal-Image-Loader对图片做的处理

答:图片的缩放方式缩放类型mageScaleType

图片的显示方式显示方式displayer

图片的异步加载  图片的三级缓存  图片的二次采样

14、简述Universal-Image-Loader如何全局配置

答:先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况。

可以选择在Application中初始化设置该类

15、简述Universal-Image-Loader加载图片的流程

配置完后,就可以开始使用了,通过ImageLoader的displayImage()绑定一个图片和ImageView,该方法有四个重载版本,传的参数比较多,这也印证了该项目提供每个图片单独的显示配置这一说法。其中参数最全的是:

displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener);

16、简述ListView的优化方案

答:复用convertView,减少findViewById的次数

1、优化一:复用convertView

2、优化二:缓存item条目的引用——ViewHolder

17、简述ListView多条目加载的实现思路

答:重写getViewTypeCount()  返回条目的总数量

重写getItemViewType方法   根据position来计算返回哪种类型

18、简述xListView实现分页加载的思路

答:首先我们把Xlistview的类包倒入工程

正常解析数据

重写2个方法onRefresh()  onLoadMore()

19、简述常用的命名规范及在Android中的体现

答:1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写。

2 帕斯卡(pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写

3 下划线命名法:单词与单词间用下划线做间隔。

4 匈牙利命名法:广泛应用于微软编程环境中,在以Pascal命名法的变量前附加小写序列说明该变量的类型。 量的取名方式为:<scope_> + <prefix_> + <qualifier>范围前缀,类型前缀,限定词。

20、简述DrawerLayout实现侧滑菜单的流程

答:DrawerLayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏,主内容区的部分可以随着菜单的点击而变化。DrawerLayout其实是一个控件,跟LinearLayout差不多,直接使用即可。drawerPosition:指定 drawer 将从屏幕的一侧滑动。

drawerWidth :指定 drawer 的宽度,即从窗口的边缘拉到视图更精确的宽度。

keyboardDismissMode :确定键盘是否响应拖动被驳回。

        'none' (默认值), 拖动不影响键盘。

        'on-drag', 拖动开始,键盘被驳回。

onDrawerClose :导航视图关闭时调用函数。

onDrawerOpen :导航视图打开时调用函数。

onDrawerSlide :与导航视图交互时调用函数。

onDrawerStateChanged :当 Drawer 状态发生变化时调用函数,drawer 有 3 种状态:

           idle -- 表示与导航视图没有交互

           dragging -- 表示目前有与导航视图的交互

           settling -- 表示有与导航视图的交互,并且导航视图正在的关闭或打开。

renderNavigationView :导航图将被渲染到屏幕的一侧,并且可以拉出。

21、简述SlidingMenu和DrawerLayout的异同

答:你看了slidingmenu的 源码就知道区别 区别就是slidingmenu 也是将view分为上下两层 但是最上层的是主内容页而下一层才是菜单页。而drawerlayout的实现是刚好相反的 菜单页是在内容页之上的 而且据我掌握的 slidingmenu的菜单宽度可以利用与菜单目标方向相距多少来确定 而drawerlayout则是直接指导菜单的大小

22、简述ViewPager的使用方式以及和Fragment配合使用的使用方式

答:很多App首次进入时候会展示导航页,需要ViewPager和Fragment配合使用,布局中把Viewpager当做一个普通控件来写,.然后再另外写4个Fragment的布局文件,分别写4个类实现这4个Fragment,在MainActivity中获取到viewpager控件,创建一个适配器,继承自FragmentPagerAdapter,就是适用于fragment的viewpager适配器.

23、简述Activity的封装思路

答:逻辑清晰  

暴露一些方法方便存储   

Activity之间都会传参,所以可以封装一个参数处理的函数initParam(),在BaseActivity的onCreate里去判断是否有参数传过来

24、简述Fragment的封装思路

答:一般写Fragment继承android.support.v4.app.Fragment 重写Fragment的生命周期实现创建过程:添加布局

封装BaseLazyFragment.java类   使用的话很简单继承BaseLazyFragment重写getContentViewLayoutID()就行。

25、简述Application的初始化及封装思路

答:继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。

26、简述Fragment生命周期及其意义

答:Fragment生命周期,依附在Activity上使用时,最先走的生命周期方法是onAttach(),是Activity和Fragment获得联系的方法,然onCreate()创建的方法,接着创建视图onCreateView(),然后等待Activity也创建完之后,走onActivityCreated()可以拿到Activity传递过来的数据,onstart(),onResume()当点返回键退出了当前应用,Activity走onPause(),onStop()和onDestroy()然后Fragment走失去联系的方法onDetach()

27、简述HorizontalScrollview使用中需要注意的问题

答:HorizontalScrollview是横向滚动视图,在布局中声明,它里面只可以有一个直接的子控件,例如一个LinerLayout,LinerLayout里面可以包含很多东西,表示ScrollView的内容是否被拉伸以适应视口的大小的方法是isFillViewport(),HorizontalScrollView设置要滚动到的位置的方法是smoothScrollTo()

28、简述HttpConnection请求网络从打开连接到关闭连接的过程

答:a: HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。  

    无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。  

 b:在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,  

    connection对象的一切配置(那一堆set函数)  

    都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。  

    这些顺序实际上是由http请求的格式决定的。  

    如果inputStream读操作在outputStream的写操作之前,会抛出例外:  

    java.net.ProtocolException: Cannot write output after reading input.......        

 c:http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文        content。connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,

    就必须把所有的配置准备好。  

 d: 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,  

    实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,  

    而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。  

    至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求  

    正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http  

    请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数  

    之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)  

都是没有意义的了,执行这些操作会导致异常的发生。

29、简述Universal-Image-Loader对图片做的两种核心处理方式

答:三级缓存  二次采样

30、简述Universal-Image-Loader可以使用的缓存策略

答:UI:请求数据,使用唯一的Key值索引Memory Cache中的Bitmap。

内存缓存:缓存搜索,如果能找到Key值对应的Bitmap,则返回数据。否则执行第三步。

硬盘存储:使用唯一Key值对应的文件名,检索SDCard上的文件。

如果有对应文件,使用BitmapFactory.decode*方法,解码

Bitmap并返回数据,同时将数据写入缓存。如果没有对应文件,执行第五步。

下载图片:启动异步线程,从数据源下载数据(Web)。

若下载成功,将数据同时写入硬盘和缓存,并将Bitmap显示在UI中。

31、简述PullToRefresh设置支持上拉下拉的方法和回调方法

答: ILoadingLayout startLabels = pullToRefresh.getLoadingLayoutProxy(true, false);

 startLabels.setPullLabel("下拉刷新...");// 刚开始下拉时显示的提示   

 startLabels.setRefreshingLabel("正在载入...");// 正在刷新时显示的提示

 startLabels.setReleaseLabel("放开刷新...");// 下来达到一定距离时显示的提示   

     ILoadingLayout endLabels = pullToRefresh.getLoadingLayoutProxy( false, true);

 endLabels.setPullLabel("上拉刷新...");// 刚开始上拉时显示的提示   

 endLabels.setRefreshingLabel("正在载入...");// 正在刷新时   

 endLabels.setReleaseLabel("放开刷新...");// 下拉达到一定距离时

32、简述PullToRefresh可以刷新的控件

答:GridView   HorizontalScrollView  ListView   ScrollView  WebView

33、简述PullToFresh在AndroidStudio项目中使用需要注意的问题

答:1、将PullToRefresh克隆到本地

2、克隆到本地后library目录复制到app同级目录下,并将名称改为PullToRefresh

3、在项目根目录下的settings.gradle下添加第三方库目录

4、app/build.gradle下添加编译依赖

5、PullToRefresh目录下添加build.gradle

6、最后别忘记Sync Now和Rebuild(Build-->Rebuild Project)

posted on 2017-10-21 14:14  葰葰  阅读(149)  评论(0编辑  收藏  举报