- 博客(35)
- 收藏
- 关注
原创 IntentFilter
Action每个Intent只能有一个Action,一般来说set…函数设置的值是唯一的,而add…函数设置的值不是唯一的。如果一个一个intent和IntentFilter要匹配则两者都不为空,且intent中的action能在intentFilter中找到。 我在官网文档中看了这么一句 Action matches if any of the given values match the
2016-12-14 20:07:22
548
原创 Volley ImageLoader
大体逻辑发送网络请求用的是volley,然后多加了一个cache这是个适配器接口推荐是LruCache,先到cache中去找,找不到在添加进volley中到网络中区请求,如果找到了那么就直接就执行图片的添加逻辑,这个逻辑直接就执行了,没有作转到主线程的操作,所一个要求get()函数必须要在主线程调用。如果没在cache中找到就添加进volley,如果这时候已经有相同的请求在队列中了那么就讲请求添加到
2016-11-28 09:32:32
306
原创 Volley DefaultRetryPolicy
有一个技术起mCurrentRetryCount计数试了多少次了。在BasicNetwork类中 public NetworkResponse performRequest(Request<?> request) throws VolleyError { long requestStart = SystemClock.elapsedRealtime(); while
2016-11-25 16:26:00
570
原创 Volley CacheDispatcher
不断地从mCacheQueue中取出请求,然后到cache中区找,如果不命中则加入到mNetworkQueue队列中让另一个去处理,如果命中,那么分两种情况,不需要刷新就直接 mDelivery.postResponse(request, response);如果需要刷新就 mDelivery.postResponse(request, response, new Runnable() {
2016-11-25 09:20:40
298
原创 Volley NetworkDispatcher
这是一个继承了线程Thread的类,用来具体处理网络请求,将request从BlockingQueue中取出来处理。这个类重写了run()方法具体会在这个方法中处理网络请求,存入缓存,以及response的分发。@Override public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BAC
2016-11-25 08:50:15
248
原创 Volley RequestQueue
这个类没有继承任何类或借口,所以他不是一个Queue。 这个类主要维护了几个队列,将request加紧队列然后开启线程处理队列中的request private final Map<String, Queue<Request>> mWaitingRequests = new HashMap<String, Queue<Request>>();这个mWaitingReques
2016-11-24 16:45:25
315
原创 Volley DiskBasedCache
大体思路这其实是一个LRU cache 用private final Map<String, CacheHeader> mEntries = new LinkedHashMap<String, CacheHeader>(16, .75f, true);来维护一个优先队列,在空间满了的时候讲那些队头的删掉,因为 LinkedHashMap的构造函数最后一个参数access
2016-11-24 15:51:48
429
原创 Volley http协议摘要
Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个 文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法 判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime
2016-11-23 21:23:46
413
原创 Volley Http缓存机制
https://www.path8.net/tn/archives/2745//如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据
2016-11-23 20:45:26
326
原创 volley PoolingByteArrayOutputStream
概述PoolingByteArrayOutputStream继承了ByteArrayOutputStream然后其中有加了一个ByteArrayPool,当ByteArrayOutputStream中的buff数组容量慢了之后,从ByteArrayPool获取新的数组,这样heap和垃圾回收机制可以少干活。这个重写了write()函数在调用基类的write之前先检查是否满了如果满了就用Pooling
2016-11-23 15:25:45
381
原创 Volley ByteArrayPool
private List<byte[]> mBuffersByLastUse = new LinkedList<byte[]>(); //维护一个优先队列,在容量超过mSizeLimit时候从优先队列的队头开始删除 private List<byte[]> mBuffersBySize = new ArrayList<byte[]>(64); //用来存放所有的数组,因为是按照二分
2016-11-23 09:43:26
410
原创 Volley 图片缩放逻辑
private static int getResizedDimension(int maxPrimary, int maxSecondary, int actualPrimary, int actualSecondary) { // If no dominant value at all, just return the actual. if
2016-11-22 19:20:29
317
原创 AIDL Binder
IBinder 是个接口,而Binder是他的实现类,binder的底层实现由驱动程序陷入内核的,大体是进程A将信息给binder从陷入内核,而后再由内核的驱动程序发给进程B,大体是这样具体我也不太清楚。 Binder真正起作用的是onTrancat() 和 Trancat()函数这两个函数主要实现了进程间的信息传递,AIDL大体流程是通过binder告诉另外一个进程我想要执行什么函数,并且
2016-11-17 09:41:56
440
原创 Socket进程间通讯
大体思路服务器开一个无线循环一直监听8688端口,如果有程序连进来就建立连接,然后从socket中获得输入输出流,在一个无限循环中不断地readline()(这个函数是堵塞的,如果连接断开则会返回null那么这时候就结束循环),客户端也是这样无限循环中不断地读,注意printwriter的构造器中要把自动刷新设为TRUE; 用Socket要设置网络权限;服务器端代码 建立接口监听,每有一个进
2016-11-17 09:21:06
1093
原创 bind另一个应用的服务
服务器xml代码<service android:name=".BookManagerService" android:process=".remote" android:enabled="true" android:exported="true"/> android:enabled 这个属性用于指示该服务是否能够
2016-11-17 09:04:31
623
原创 HashSet
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();public static void main(String[] args){Set<Person> set = new HashSet<Person>();Person p1 = new Person("唐
2016-11-10 09:09:32
193
原创 CopyOnWriteArrayList
public boolean add(E e) { final ReentrantLock lock = this.lock; // 获取独占锁 lock.lock(); try { Object[] elements = getArray(); in
2016-11-08 20:43:40
200
原创 CorrentHashMap
/** * 使用 key 的散列码来得到 segments 数组中对应的 Segment */ final Segment<K,V> segmentFor(int hash) { // 将散列值右移 segmentShift 个位,并在高位填充 0 // 然后把得到的值与 segmentMask 相“与” // 从而得到 hash 值对应的 segm
2016-11-08 17:10:43
973
原创 volatile
双重检测class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance==null) { synchronize
2016-11-03 19:17:10
335
原创 PULL解析XML
public void readXMLPull(InputStream in){ try { XmlPullParser parser=XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(in,"UTF-8"); int eve
2016-11-02 19:25:33
215
原创 DOM
InputStream in=getResources().openRawResource(R.raw.book); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder dBuilder=dbFactory
2016-11-02 10:45:43
218
原创 SAX解析xml
xml<books xmlns:xx="www.bb.com"> <xx:book xx:id="1"> <name ss="lirui">happy day</name> <author>li</author> </xx:book> <book id="2"> <name>bad bed</name> <au
2016-11-01 19:04:21
253
原创 String
构造方法public String(String original) { this.value = original.value; this.hash = original.hash; }public int compareTo(String anotherString) { //自身对象字符串长度len1 int len1 = value.length; /
2016-10-26 19:44:53
220
原创 匿名内部类
interface prin{ public void write(); }public class tt { static int xx=123; public static void main(String[] args){ final String ss="lrui"; new prin(){
2016-10-26 18:55:27
204
原创 LinkedList
想到一个优化–`if (prev == null) { first = next; } else { prev.next = next; x.prev = null; }if (next == null) { last = prev; } else { next.prev = prev; x.next = null; }` 要是
2016-10-24 18:41:29
293
原创 ArrayList
RandomAccess这个借口是空的,这是一个标记借口,可以用instanceof来确定ArrayList是否实现了这个借口,即是否实现了特定功能。 - 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深
2016-10-24 16:02:39
206
原创 LinkedHashMap
LinkedHashMap如果只是从头上讲元素删除,接到尾上,其实是可以使用单链表的。其实是可以使用单链表的,在定位到某一个元素的过程中顺便就可以吧他前面的元素找到,这样就可以删除了,而在尾部的插入用单链表也能完成。这样写我才是比较节省时间吧。 这一条(第一条)我理解错了,我以为是用我以为table[]所存的是一个双链表,其实LinkedHashMap是有两个链表,一个是继承了hashMap的ta
2016-10-19 15:32:03
243
转载 HashMap源码学习
Lru的意思是先淘汰时间最远的哪一个,LFU则淘汰使用频率最小的哪一个。Hashmap static int indexFor(int h, int length) { return h & (length-1); } 相当于%但length要是2的幂。hashCode()用来确定对象在hashmap中的位置,函数返回一个整数,如果a.equa
2016-10-17 16:29:43
229
原创 AdapterVIew
像ListView这种AdapterView是不允许在Adapter内部调用addView()方法的否则就会出错,这样在public View getView(int position, View convertView, ViewGroup parent)方法中就必须这样写convertView=LayoutInflater.from(getContext()).inflate(R.layout.
2016-09-22 20:19:46
236
原创 TypeToken
TypeToken<List<String>> list = new TypeToken<List<String>>() {}这是创建了一个空的匿名内部类{}符号的意思是空的。
2016-09-22 20:14:39
594
原创 易家项目学习笔记
Gson gson = (new GsonBuilder()).registerTypeAdapter(A.class, new JsonParseAdapter())可以为指定类型定制序列化反序列化的方式,比如只得到一个父类的指针就可以定制将Json反序列化到那一个具体的子类。Obserable Observor 观察者模式 -机械键盘到手了 开心
2016-09-20 09:52:24
255
原创 四种启动模式
关于启动模式的分析,android开发艺术探索中间的很详细。standard 这要注意的是别的activity启动他的时候他会在启动他的activity的栈中。但是如果singleInstance启动他则不会在启动他的activity的栈中,因为singleInstance是单独一个栈中单独一个实例的。singleTop和standard类似,加上栈顶复用。singleTask 这个和sing
2016-09-13 11:36:01
294
原创 Handler相关
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) {
2016-09-11 16:07:19
248
原创 Git
我在github上新建了README.MD,然后就无法push,pull也不行,最后用 git pull --allow-unrelated-histories 强制合并。然后在push。
2016-09-11 15:26:03
219
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人