Android
1、简述Http请求和响应的组成部分
答:户端通过发送HTTP请求向服务器请求对资源的访问。
HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。
请求行以一个方法符号开头,后面跟着请求URI和协议的版本,以CRLF作为结尾。
请求行以空格分隔。除了作为结尾的CRLF外,不允许出现单独的CR或LF字符
2、简述get和post的区别
答:(1)get是从服务器上获取数据,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)