前言

AsyncTask的本身其实是对Handler机制的封装,目的是让异步操作的实现变得简单,更多的关注业务实现。

基本步骤

  • 创建一个继承自AsyncTask的类。
  • 确定AsyncTask<Params(参数), Progress(进度), Result(结果)> 泛型的三个参数类型。
  • 重写以下方法:
1
2
3
4
protected void onPreExecute() //可选
protected abstract Result doInBackground(Params... params); //必须重写
protected void onPostExecute(Result result) //可选,但一般都会重写
protected void onProgressUpdate(Progress... values) //可选,如果不需要进度可以写Void(大写的V)

注意:

  1. onPreExecute 方法会在execute方法调用前调用,运行在UI线程,可以做进度框的展示等
  2. doInBackground方法的参数是可选参数,类型由创建类时决定,并且该方法是执行在子线程中的,可以做一些耗时操作
  3. onPostExecute 方法的参数也是创建类时决定,可以是String、Bitmap类型等,运行在UI线程中,根据返回的result,这里的result的类型就是doInBackground 的返回值类型,因此可以更新UI
  4. onProgressUpdate 方法的参数是可选参数,可以展示任务处理的进度,不过需要通过在doInBackground 中根据下载内容占总下载内容的比例主动调用publishProgress 方法,才会回调onProgressUpdate 方法。
  • 实例化该异步任务类,并调用AsyncTask execute(Params... params) 方法启动任务。

Read More

软件开发总是强调一个重点,就是尽可能的将系统做到高内聚低耦合,各模块各司其职,职责单一,逻辑清晰。

mvp框架图

从上图可以清晰的理解什么是MVP(Model、View、Presenter)架构,其实MVP是从MVC模式衍生出来的,目的就是为了让视图层view和模型层model之间解耦。它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

从职责上来说MVP是:

  • View层负责处理用户事件和视图部分的展示。在Android中,它可能是Activity或者Fragment类。
  • Model层负责访问数据。数据可以是远端的Server API,本地数据库或者SharedPreference等。
  • Presenter层是连接(或适配)View和Model的桥梁。

Read More

什么是SQLite?

SQLite是一款轻型数据库,它遵守ACID,能够嵌入到使用它的应用程序中。作为一个自包含的、基于文件的数据库,SQLite提供了非常出色的工具集能够处理所有类型的数据,与托管在服务器上基于进程的关系型数据库相比它的约束更少,也更易用。

当应用程序使用SQLite时,SQLite并非作为一个独立进程通过某种通信协议(例如socket)与应用程序通信,而是作为应用程序的一部分,应用程序通过调用SQLite的接口直接访问数据文件。

为什么要用 SQLite?

  • 不需要一个单独的服务器进程或操作的系统(无服务器的)。
  • SQLite 不需要配置,这意味着不需要安装或管理。
  • 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
  • SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
  • SQLite 是自给自足的,这意味着不需要任何外部的依赖。
  • SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
  • SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
  • SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
  • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。

Read More

看别人的技术博客

  • CodeKK —— 专注于开源项目源码解析及优秀开源项目的分享

  • Trinea —— 性能优化、源码解析

  • 老罗的Android之旅 —— Android系统源代码分析

  • 开发技术前线 —— 《Android源码设计模式》作者 Mr.Simple 维护的社区网站

  • 爱哥 ——《Android源码设计模式》作者 关爱民

  • 任玉刚 —— 《Android开发艺术探索》作者 CSDN博客

  • 郭霖 —— 《第一行代码》作者 CSDN博客

  • 鸿洋 —— CSDN 博客专家

  • 胡凯 —— 专注性能优化

  • 张明云 —— Android学习之路

  • Drakeet —— 贝壳单词APP开发者

  • 徐宜生 —— 《Android群英传》作者

  • 代码家 —— 著名博主

Read More

对于普通的编辑框,它的功能就是负责接收用户输入的信息,在实际开发中,常常会有这样的设计,就是在输入内容后,编辑框的内部右侧会出现一个删除按钮,点击后会清空编辑框里的内容,这样的交互是极好的,那这又是怎么实现的呢?

解决思路毫无疑问是——继承自EditText,自定义文本编辑框

  • 为EditText设置addTextChangeListener
  • 创建内部类实现TextWatcher接口,监听输入框文本的变化
  • 改写onTouchEvent事件,点击叉号位置,清空文本
  • 通过setCompoundDrawablesWithIntrinsicBounds方法为EditText设置图片

Read More

Android中对话框的展示,对人机交互有着重要的意义,常见的对话框包括:

  • 警告对话框

  • 进度对话框

  • 日期选择对话框

  • 时间选择对话框

  • 普通列表对话框

  • 单选列表对话框

  • 多选列表对话框

  • 带图标的列表对话框

对于特殊的对话框形式还可以自定义对话框

Read More

作为Android四大组件之一的BroadcastReceiver(广播接收者),同Activity(活动)一样,经常被大家用到,网上也是一堆对它的讲解,那么为什么Android要用广播接收者这种机制呢?

广播分为:普通广播和有序广播

1.Normal broadcasts(普通广播):Normal broadcasts是完全异步的可以同一时间被所有的接收者接收到。消息的传递效率比较高。但缺点是接收者不能将接收的消息的处理信息传递给下一个接收者也不能停止消息的传播。可以利用Context.sendBroadcast发送。

2.Ordered broadcasts(有序广播):Ordered broadcasts的接收者按照一定的优先级进行消息的接收。一次传送到一个接收器。 随着每个接收器依次执行,它可以将结果传播到下一个接收器,或者它可以完全中止广播,使得它不会被传递到其他接收器。 命令接收器运行可以用匹配的意图过滤器的android:priority属性控制; 具有相同优先级的接收器将以任意顺序运行。可以利用Context.sendOrderedBroadcast发送。

Read More

1、LruCache是什么?

最初我也不知道去缓存请求到的数据,直接都是通过http请求,根据得到的返回数据展示到界面上,网络不好时要等待好久请求才能成功,或者干脆就失败了,这样给用户的体验是很不好的。之后在学习中,了解到了Android SDK中有处理缓存的LruCache,这个LruCache是在android.util包下的,是API level 12引入的,对于API level 12之前的系统可以使用support library v4中的LruCache。

1.LruCache是一个泛型类。
2.LRU是Least Recently Used的缩写,即“最近最少使用”,说明LRU缓存算法的淘汰策略是把最近最少使用的数据移除,让出内存给最新读取的数据。
3.它采用的是内存缓存数据,它内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象。
4.它是线程安全的。
5.其中提供了put、get、remove方法来完成缓存的添加、获取和移除操作。
6.每次添加的缓存对象会置顶,当缓存满时,LruCache会移除较早使用的缓存对象,然后再添加新的缓存对象。

通常我们需要用到的缓存策略,简单的来说是将从网络请求得到的数据先缓存到内存中,等到下次再请求的时候,先从缓存中去获取,如果缓存中有,就将缓存数据取出;如果没有,则再从网络上请求,这是一种基本的缓存策略。

2、如何使用LruCache?

Read More

初识Android之体验篇

还记得最初接触Android是在我大二的时候,那时下学期刚开学,每逢开学季学校的移动电信营业厅都会做各种促销活动,新款的手机当然也包括在内。当时我就有听说过Android手机有好多炫酷的操作和功能,能很方便的听音乐,看电影什么的,所以我果断打算买一个新手机,华为c8812电信版。

hw-c8812

相对于之前使用过的电阻屏的手机来说,这种电容屏的手机操作起来,感觉简直太棒了,再加上新的Android 4.0系统,界面也相对的更加鲜艳亮丽,后来了解到这个版本叫Ice Cream Sandwich(冰淇淋三明治),这个手机可以拍照、3G上网、下软件、听音乐、看电影、玩游戏,几乎原来电脑上可以干的,手机都可以做到,而且更方便。可以说当时对Android的印象都是来自于对手机的体验,虽然当时的手机市场还是苹果占据主要地位,但是iPhone的价格还是太贵,对于我来说,并没有那么多钱去买,而Android手机价格亲民,也能满足我的基本需求,这点我就很满意了,对于这个客观事实,我也就自然而然的选择了Android阵营,对它充满了好奇,想知道为什么我点了一个图标,就可以打开一个界面,图片、声音都可以展现出来;为什么有时候会有对话框提示,通知消息;为什么我手机用久了就会卡卡的,好多关于Android的疑问。

Read More