Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

Android 中 LoaderManager 用 restartLoader 频繁启动 AsyncTaskLoader 产生 RejectedExecutionException 的解决方案

发表于 2016-02-18 | 分类于 Android | | 阅读次数

在项目过程中遇到 AsyncTaskLoader 出现 RejectedExecutionException 报错应用退出的问题,问题是偶现的,后面发现根本原因是因为 AsyncTask 的 cancel(false) 方法并没有真正的取消掉任务。下面我写了一个会出现这个问题的 demo,看看这个问题是如何产生的。

问题分析

demo 的关键代码如下:

阅读全文 »

一步一步扩展 Volley (一),Volley 框架解析

发表于 2016-01-13 | 分类于 Android | | 阅读次数

去年 11 月开始写一个扩展 Volley 的网络通信框架 ———— VolleyEx,虽然 Github 上已经有 VolleyPlus 等优秀的扩展框架,但我想借此研究异步加载网络请求的原理,学习下 Volley 的代码设计,所以还是自己重新写一个扩展框架。并且把我一步一步扩展 Volley 的过程用博客的形式记录下来,希望可以帮助大家更好地理解 Volley 及网络加载。在扩展 Volley 之前,需要先了解其大致框架,明白它的优势与不足,这也是这篇文章的主要内容。

Volley 简介

Volley 是 2013 Google I/O Session 推出的一个网络通信框架,便于异步加载网络请求和图片请求,适用于数据量小和通信频繁的网络操作。但是对于数据量大的网络(例如文件下载),Volley 的表现就很糟糕了,这种情况推荐用 DownloadManager。

根据 Android 官方培训课程中 Volley 教程的说明,Volle 有下面几个优点:

  1. 自动调度网络请求

  2. 高并发网络连接

  3. 通过标准的 HTTP cache coherence 缓存磁盘,内存透明的响应

  4. 支持指定请求的优先级

  5. 框架容易定制,如重试和回退功能

  6. 清晰的加载流程使异步加载网络数据并正确地显示到UI更加简单

  7. 包含了调试与追踪工具

关于 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 年终总结

发表于 2015-12-31 | 分类于 随笔 | | 阅读次数

回想 2015 年发生的点点滴滴,感觉时间过的好快呀,1 月 1 日我才正式对外公开这个新的博客,今天就是 2015 年的最后一天了。现在回想这一年,各种各样的事情充满了脑海,觉得非常有必要趁现在还能记得清,把这些事情理顺出来并做个总结。方便以后倒回来看看当前的自己究竟都在折腾些什么,也可以当一个纪念吧,以后的每一年的最后一天也写一篇年终总结。

2015 年的 1 月 1 日我在微博和 QQ 上公开了这个技术博客,这个博客是 2014 年的 7 月用 Github Pages 和 Jekyll 搭建起来的,之后利用空闲时间修改样式,添加响应式布局。然后陆陆续续写了些博客,最终在 1 月 1 日正式对外公开。不过这个博客现在的访问量还很少,我之前的技术博客 Lucky Johnny’s blog 到是基本上每天 90 左右的访问量,这让我觉得有点落差。我分析了博客的来源,基本是通过谷歌搜索访问的,百度根本搜索不到我的博客。其实这种新的网站访问量低也是正常的,希望通过自己的努力明年博客的访问量可以到之前博客的水平。

阅读全文 »

如何优雅地使用 Ubuntu 14.04 LTS

发表于 2015-12-26 | 分类于 Ubuntu | | 阅读次数

最近在折腾我的本本 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 关闭在线搜索建议

在 Dash 搜索内容的时候会显示在线搜索建议,显然这个完全没有必要,很影响体验。

可以在系统的 System Settings > Security & Privacy > Search 中去掉 Include online search results 的选项。

然后可以 Dash App 下禁用很多不需要的 Dash Plugins,提高运行速度.

解决 gedit 中文乱码

一般情况都是用 gedit 编辑文本文件,gedit 可以设置显示行数和高亮当前行,但是 gedit 对中文字符集的支持不是很好,有时会出现乱码的情况。

可以在终端输入下面命令,添加中文编码

1
2
gsettings set org.gnome.gedit.preferences.encodings auto-detected "['GB18030', 'GB2312', 'GBK', 'UTF-8', 'BIG5', 'CURRENT', 'UTF-16']"
gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "['GB18030', 'GB2312', 'GBK', 'UTF-8', 'BIG5', 'CURRENT', 'UTF-16']"

也通过 dconf-editor 编辑修改,需要先安装 dconf-tools。

阅读全文 »

Android LayoutInflater 深层解析

发表于 2015-09-09 | 分类于 Android | | 阅读次数

一般学过一段时间的 Android 的开发者都知道 LayoutInflater 可以用来动态把 layout 布局文件生成 View。下面我结合实例与源码一步一步分析 LayoutInflater 的使用方法和内部原理,首先从如何获得 LayoutInflater 的实例开始。

获得 LayoutInflater 实例

我们没法通过构造函数实例化 LayoutInflater 对象,因为构造函数是 protected 的,一般通过下面两种方法得到一个标准的 LayoutInflater 实例。

第一种方式

1
2
//android.app.Activity#getLayoutInflater()
LayoutInflater layoutInflater = mActivity.getLayoutInflater();

第二种方式

1
2
LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);

LayoutInflater 有个静态方法对第二种方式做了一下封装,也是我经常使用的方式,源码如下:

1
2
3
4
5
6
7
8
9
10
11
/**
* Obtains the LayoutInflater from the given context.
*/
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}

inflate 加载布局文件

得到 LayoutInflater 实例后就可以调用 inflate 方法加载布局文件了,一般使用其提供的下面两个方法:

阅读全文 »
1…111213…16
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 访问量