在项目过程中遇到 AsyncTaskLoader 出现 RejectedExecutionException 报错应用退出的问题,问题是偶现的,后面发现根本原因是因为 AsyncTask 的 cancel(false) 方法并没有真正的取消掉任务。下面我写了一个会出现这个问题的 demo,看看这个问题是如何产生的。
问题分析
demo 的关键代码如下:
人如果没有梦想,跟咸鱼有什么分别
在项目过程中遇到 AsyncTaskLoader 出现 RejectedExecutionException 报错应用退出的问题,问题是偶现的,后面发现根本原因是因为 AsyncTask 的 cancel(false) 方法并没有真正的取消掉任务。下面我写了一个会出现这个问题的 demo,看看这个问题是如何产生的。
demo 的关键代码如下:
去年 11 月开始写一个扩展 Volley 的网络通信框架 ———— VolleyEx,虽然 Github 上已经有 VolleyPlus 等优秀的扩展框架,但我想借此研究异步加载网络请求的原理,学习下 Volley 的代码设计,所以还是自己重新写一个扩展框架。并且把我一步一步扩展 Volley 的过程用博客的形式记录下来,希望可以帮助大家更好地理解 Volley 及网络加载。在扩展 Volley 之前,需要先了解其大致框架,明白它的优势与不足,这也是这篇文章的主要内容。
Volley 是 2013 Google I/O Session 推出的一个网络通信框架,便于异步加载网络请求和图片请求,适用于数据量小和通信频繁的网络操作。但是对于数据量大的网络(例如文件下载),Volley 的表现就很糟糕了,这种情况推荐用 DownloadManager。
根据 Android 官方培训课程中 Volley 教程的说明,Volle 有下面几个优点:
自动调度网络请求
高并发网络连接
通过标准的 HTTP cache coherence 缓存磁盘,内存透明的响应
支持指定请求的优先级
框架容易定制,如重试和回退功能
清晰的加载流程使异步加载网络数据并正确地显示到UI更加简单
包含了调试与追踪工具
关于 Volley 的不足之处,在解析完其框架再来讨论。
Volley 的官方项目地址: https://android.googlesource.com/platform/frameworks/volley/
Volley 的 Github 地址(由国人做的映射): https://github.com/mcxiaoke/android-volley
这是 2013 Google I/O 大会上关于 Volley 的文档: Volley-Easy,Fast Networking for Android.pdf
回想 2015 年发生的点点滴滴,感觉时间过的好快呀,1 月 1 日我才正式对外公开这个新的博客,今天就是 2015 年的最后一天了。现在回想这一年,各种各样的事情充满了脑海,觉得非常有必要趁现在还能记得清,把这些事情理顺出来并做个总结。方便以后倒回来看看当前的自己究竟都在折腾些什么,也可以当一个纪念吧,以后的每一年的最后一天也写一篇年终总结。
2015 年的 1 月 1 日我在微博和 QQ 上公开了这个技术博客,这个博客是 2014 年的 7 月用 Github Pages 和 Jekyll 搭建起来的,之后利用空闲时间修改样式,添加响应式布局。然后陆陆续续写了些博客,最终在 1 月 1 日正式对外公开。不过这个博客现在的访问量还很少,我之前的技术博客 Lucky Johnny’s blog 到是基本上每天 90 左右的访问量,这让我觉得有点落差。我分析了博客的来源,基本是通过谷歌搜索访问的,百度根本搜索不到我的博客。其实这种新的网站访问量低也是正常的,希望通过自己的努力明年博客的访问量可以到之前博客的水平。
最近在折腾我的本本 Lenovo I1000,本来想安装 Windows 系统,但是安装 win7 和 win8 中途都出现了文件损坏的问题,就索性用 U 盘安装了 Ubuntu 14.04 系统。之前在 2012 年就开始尝试过 12.04 版本,感觉用来开发还是不错的,因为玩游戏上 QQ 都不太方便,所以少了很多干扰. 不过安装完系统后需要做一些优化,才能让自己用的更加顺手。
建议安装的时候先选择中文语言,在 language-support 更新语言包再切换到 English,这样中文编码的问题可以少一点.
这里先给给出我的电脑配置:
机型: Lenovo I1000 (联想小新出色版)
显卡: Intel 集成显卡
系统: Ubuntu 14.04 64 位
声卡: High Definition Audio
语言: English
下面把自己体验的 Ubuntu 14.04 的优化方案整理一下,以防下次折腾的时候四处 Google,也希望对大家有些帮助。
下面的命令中有的是用sudo
有的是用gksudo
,而gksudo
需要先通过sudo apt-get install gksu
安装后才能使用。
简单说明一下两者的区别:
sudo: 用来执行命令行 (CLI) 程序,是当前用户的 home 目录
gksudo: 用来执行图形的 (GUI) 程序,是 root 用户的 home 目录
在 Dash 搜索内容的时候会显示在线搜索建议,显然这个完全没有必要,很影响体验。
可以在系统的 System Settings > Security & Privacy > Search 中去掉 Include online search results 的选项。
然后可以 Dash App 下禁用很多不需要的 Dash Plugins,提高运行速度.
一般情况都是用 gedit 编辑文本文件,gedit 可以设置显示行数和高亮当前行,但是 gedit 对中文字符集的支持不是很好,有时会出现乱码的情况。
可以在终端输入下面命令,添加中文编码
|
|
也通过 dconf-editor 编辑修改,需要先安装 dconf-tools。
一般学过一段时间的 Android 的开发者都知道 LayoutInflater 可以用来动态把 layout 布局文件生成 View。下面我结合实例与源码一步一步分析 LayoutInflater 的使用方法和内部原理,首先从如何获得 LayoutInflater 的实例开始。
我们没法通过构造函数实例化 LayoutInflater 对象,因为构造函数是 protected 的,一般通过下面两种方法得到一个标准的 LayoutInflater 实例。
|
|
|
|
LayoutInflater 有个静态方法对第二种方式做了一下封装,也是我经常使用的方式,源码如下:
|
|
得到 LayoutInflater 实例后就可以调用 inflate 方法加载布局文件了,一般使用其提供的下面两个方法: