计算机网络
http/1.1协议的8种请求方式
head、post、get、put、delete、connect、option、trace
请求状态码responseCode含义:
- 1xx:请求继续;
- 2xx:请求正常处理,如200请求正常;
- 3xx:请求完成,需要进一步处理,重定向;如302;
- 4xx:请求出错,如404访问的浏览器找不到;
- 5xx:服务器内部错误,如500服务器遇到了未预料到的错误。
java
java修饰符作用范围
android
viewpager+fragment配合使用的生命周期
ViewPager加载时同时加载上一个、当前、下一个三个item。即会调用onAttach--onCreate--onCreateView--onViewCreated--onActivityCreated--onStart--onResume生命周期,而其他的fragment若被初始化过了,则会调用onPause--onStop--onDestoryView。
ViewPager中的Fragment生命周期总是相邻的三个item同时进行的。因此,如果想在fragment显示的时候加载网络数据(懒加载),通过生命周期来做文章是很难实现的,推荐重写setUserVisibleHint()。
懒加载
什么叫懒加载呢,简单来说就是你需要的时候才去加载它,这样提高了运行速度。
安卓中的懒加载
在android的项目开发过程中viewPager的使用很频繁;但是viewPager特殊的预加载机制导致viewPager的网络请求会有异常;即当前页面加载过程中,不可见的预加载Fragment页面也会走网络请求,这样会极大的影响到安卓app的运行效率。
1:setUserVisibleHint(boolean isVisibleToUser)的方法就很重要,根据方法名来看当前页面是否可见, 里面的boolean值就是判断当前页面是否可见的变量,所以大家可以isVisibleToUser来判断当前页面的状态,isVisibleToUser =true的时候代表当前页面可见,false 就是不可见,所以大家可以参考一下这个状态,根据这个状态来处理懒加载。
2:提醒:setUserVisibleHint(boolean isVisibleToUser) 实在Fragment OnCreateView()方法之前调用的。
LruCache的使用
LruCache是Android 3.1所提供的一个缓存类,所以在Android中可以直接使用LruCache实现内存缓存。而DisLruCache目前在Android 还不是Android SDK的一部分,但Android官方文档推荐使用该算法来实现硬盘缓存。
- 原理
LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用(即我们平常使用的对象引用方式)存储在 LinkedHashMap 中。当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作。(设置LruCache缓存的大小,一般为当前进程可用容量的1/8。)
LruCache的核心思想很好理解,就是要维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队尾,即将被淘汰。而最近访问的对象将放在队头,最后被淘汰。
广播是否可以请求网络?
从4.0 开始所有的网络请求都需要在线程中,广播请求网络同理 开启线程在线程中请求网络
引起anr的时间限制是多少?
Activity----->5秒
BroadcastReceiver----->10秒
Service----->20秒
Android为什么引入Parcelable?
Java提供了Serializable接口方式实现序列化,但这种方式效率较低。因此,安卓提供Parcelable接口以实现更加高效的序列化方式。
进程间通信的方式?
1)Bundle
2)文件共享
3)AIDL
4)Messager
5)ContentProvider
6)Socket
关于startActivityForresult
- 作用:一个activity打开另一个activity获取数据后,新activity关闭
- 用法
MainActivity:
1)startActivityForResult(intent,int code),code用于标识哪个activity返回的数据;
2)重写onActivityResult(int requestCode,int resultCode,intent),requestCode就是上面那个code,resultCode用于判断回调的数据是否成功了。
NewActivity:
setResult(int resultCode),setResult(int resultCode, Intent),resultCode回调状态,就是上面的resultCode,Intent数据
- 失效:如果NewActivity的launchMode是singleInstance或singleTask,就不行。
Android中为什么主线程不会因为Looper.loop()里的死循环阻塞?
主线程确实是阻塞的,不阻塞那APP怎么能一直运行,所以说主线程阻塞是一个伪命题,只不过是没有弄明白既然阻塞了,为什么还能调用各种声明周期而已.
调用生命周期是因为有Looper,有MessageQueue,还有沟通的桥梁Handler,通过IPC机制调用Handler发送各种消息,保存到MessageQueue中,然后在主线程中的Looper提取了消息,并在主线程中调用Handler的方法去处理消息.最终完成各种声明周期.
Android 动画
- 帧动画、补间动画,android3.0之后加了属性动画
- 帧动画:一张张单独的图片连贯的进行播放。
用法如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/a_0"
android:duration="100" />
<item
android:drawable="@drawable/a_1"
android:duration="100" />
<item
android:drawable="@drawable/a_2"
android:duration="100" />
</animation-list>
ImageView animationImg1 = (ImageView) findViewById(R.id.animation1);
animationImg1.setImageResource(R.drawable.frame_anim1);
AnimationDrawable animationDrawable1 = (AnimationDrawable) animationImg1.getDrawable();
animationDrawable1.start();
- 补间动画
分为:alpha(淡入淡出),translate(位移),scale(缩放),rotate(旋转)
一般会采用xml 文件的形式;代码会更容易书写和阅读,同时也更容易复用。用法如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
//单独的动画不需要set便签
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
img = (ImageView) findViewById(R.id.img);
img.startAnimation(animation);
- 属性动画
原理:改变对象view的属性值,比如你可以定义一个动画:指定要执行的对象属性,在屏幕的位置,持续时间以及它变化的属性值。
ArrayList与LinkedList区别(三点)
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
牛客网
- 在同一线程中肯定会调用一个 Loop.prepare() ,其中就生成一个 MessageQueue .而代码中可以 new 出多个 Handler 发送各自的 Message 到这个 MessageQueue 中,最后调用 msg.target.dispatch 中这个target来捕获自己发送的massge,所以明显是 N 个 Handler 对应一个 MessageQueue。
{
1. Handler 必须在 Looper.prepare() 之后才能创建使用
2. Looper 与当前线程关联,并且管理着一个 MessageQueue
3. Message 是实现 Parcelable接口的类
4. 以一个线程为基准,他们的数量级关系是:Handler(N) : Looper(1) : MessageQueue(1) : Thread(1)。
} - Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
-Android中正确构造一个对话框:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
ProgressDialog dialog = new ProgressDialog(context);
- activity的生命周期在onStart~onStop之间是可见状态的,当执行onResume后用户才可以与activity交互。当调用onStop而没有调用onDestory时,再次启动会调用onRestart,而如果只调用了onPause而没有调用onStop(比如当前是透明的activity或者是消息框什么的),则不会调用onRestart.