自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 490

原创 Volley ImageLoader

大体逻辑发送网络请求用的是volley,然后多加了一个cache这是个适配器接口推荐是LruCache,先到cache中去找,找不到在添加进volley中到网络中区请求,如果找到了那么就直接就执行图片的添加逻辑,这个逻辑直接就执行了,没有作转到主线程的操作,所一个要求get()函数必须要在主线程调用。如果没在cache中找到就添加进volley,如果这时候已经有相同的请求在队列中了那么就讲请求添加到

2016-11-28 09:32:32 255

原创 Volley DefaultRetryPolicy

有一个技术起mCurrentRetryCount计数试了多少次了。在BasicNetwork类中 public NetworkResponse performRequest(Request<?> request) throws VolleyError { long requestStart = SystemClock.elapsedRealtime(); while

2016-11-25 16:26:00 507

原创 Volley CacheDispatcher

不断地从mCacheQueue中取出请求,然后到cache中区找,如果不命中则加入到mNetworkQueue队列中让另一个去处理,如果命中,那么分两种情况,不需要刷新就直接 mDelivery.postResponse(request, response);如果需要刷新就 mDelivery.postResponse(request, response, new Runnable() {

2016-11-25 09:20:40 255

原创 Volley NetworkDispatcher

这是一个继承了线程Thread的类,用来具体处理网络请求,将request从BlockingQueue中取出来处理。这个类重写了run()方法具体会在这个方法中处理网络请求,存入缓存,以及response的分发。@Override public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BAC

2016-11-25 08:50:15 212

原创 Volley RequestQueue

这个类没有继承任何类或借口,所以他不是一个Queue。 这个类主要维护了几个队列,将request加紧队列然后开启线程处理队列中的request private final Map<String, Queue<Request>> mWaitingRequests = new HashMap<String, Queue<Request>>();这个mWaitingReques

2016-11-24 16:45:25 276

原创 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 401

原创 Volley http协议摘要

Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个 文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法 判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime

2016-11-23 21:23:46 339

原创 Volley Http缓存机制

https://www.path8.net/tn/archives/2745//如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据

2016-11-23 20:45:26 298

原创 volley PoolingByteArrayOutputStream

概述PoolingByteArrayOutputStream继承了ByteArrayOutputStream然后其中有加了一个ByteArrayPool,当ByteArrayOutputStream中的buff数组容量慢了之后,从ByteArrayPool获取新的数组,这样heap和垃圾回收机制可以少干活。这个重写了write()函数在调用基类的write之前先检查是否满了如果满了就用Pooling

2016-11-23 15:25:45 329

原创 Volley ByteArrayPool

private List<byte[]> mBuffersByLastUse = new LinkedList<byte[]>(); //维护一个优先队列,在容量超过mSizeLimit时候从优先队列的队头开始删除 private List<byte[]> mBuffersBySize = new ArrayList<byte[]>(64); //用来存放所有的数组,因为是按照二分

2016-11-23 09:43:26 352

原创 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 280

原创 AIDL Binder

IBinder 是个接口,而Binder是他的实现类,binder的底层实现由驱动程序陷入内核的,大体是进程A将信息给binder从陷入内核,而后再由内核的驱动程序发给进程B,大体是这样具体我也不太清楚。 Binder真正起作用的是onTrancat() 和 Trancat()函数这两个函数主要实现了进程间的信息传递,AIDL大体流程是通过binder告诉另外一个进程我想要执行什么函数,并且

2016-11-17 09:41:56 381

原创 Socket进程间通讯

大体思路服务器开一个无线循环一直监听8688端口,如果有程序连进来就建立连接,然后从socket中获得输入输出流,在一个无限循环中不断地readline()(这个函数是堵塞的,如果连接断开则会返回null那么这时候就结束循环),客户端也是这样无限循环中不断地读,注意printwriter的构造器中要把自动刷新设为TRUE; 用Socket要设置网络权限;服务器端代码 建立接口监听,每有一个进

2016-11-17 09:21:06 1019

原创 bind另一个应用的服务

服务器xml代码<service android:name=".BookManagerService" android:process=".remote" android:enabled="true" android:exported="true"/> android:enabled 这个属性用于指示该服务是否能够

2016-11-17 09:04:31 543

原创 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 174

原创 CopyOnWriteArrayList

public boolean add(E e) { final ReentrantLock lock = this.lock; // 获取独占锁 lock.lock(); try { Object[] elements = getArray(); in

2016-11-08 20:43:40 170

原创 CorrentHashMap

/** * 使用 key 的散列码来得到 segments 数组中对应的 Segment */ final Segment<K,V> segmentFor(int hash) { // 将散列值右移 segmentShift 个位,并在高位填充 0 // 然后把得到的值与 segmentMask 相“与” // 从而得到 hash 值对应的 segm

2016-11-08 17:10:43 889

原创 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 305

原创 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 186

原创 DOM

InputStream in=getResources().openRawResource(R.raw.book); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder dBuilder=dbFactory

2016-11-02 10:45:43 195

原创 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 222

原创 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 190

原创 匿名内部类

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 185

原创 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 209 1

原创 ArrayList

RandomAccess这个借口是空的,这是一个标记借口,可以用instanceof来确定ArrayList是否实现了这个借口,即是否实现了特定功能。 - 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深

2016-10-24 16:02:39 186

原创 LinkedHashMap

LinkedHashMap如果只是从头上讲元素删除,接到尾上,其实是可以使用单链表的。其实是可以使用单链表的,在定位到某一个元素的过程中顺便就可以吧他前面的元素找到,这样就可以删除了,而在尾部的插入用单链表也能完成。这样写我才是比较节省时间吧。 这一条(第一条)我理解错了,我以为是用我以为table[]所存的是一个双链表,其实LinkedHashMap是有两个链表,一个是继承了hashMap的ta

2016-10-19 15:32:03 218

转载 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 200

原创 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 209

原创 TypeToken

TypeToken<List<String>> list = new TypeToken<List<String>>() {}这是创建了一个空的匿名内部类{}符号的意思是空的。

2016-09-22 20:14:39 551

原创 易家项目学习笔记

Gson gson = (new GsonBuilder()).registerTypeAdapter(A.class, new JsonParseAdapter())可以为指定类型定制序列化反序列化的方式,比如只得到一个父类的指针就可以定制将Json反序列化到那一个具体的子类。Obserable Observor 观察者模式 -机械键盘到手了 开心

2016-09-20 09:52:24 198

原创 四种启动模式

关于启动模式的分析,android开发艺术探索中间的很详细。standard 这要注意的是别的activity启动他的时候他会在启动他的activity的栈中。但是如果singleInstance启动他则不会在启动他的activity的栈中,因为singleInstance是单独一个栈中单独一个实例的。singleTop和standard类似,加上栈顶复用。singleTask 这个和sing

2016-09-13 11:36:01 234

原创 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 194

原创 Git

我在github上新建了README.MD,然后就无法push,pull也不行,最后用 git pull --allow-unrelated-histories 强制合并。然后在push。

2016-09-11 15:26:03 193

原创 欢迎使用CSDN-markdown编辑器

第一个

2016-09-10 16:23:07 144

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除