首页 > 代码库 > android app 架构设计02

android app 架构设计02

二:在开放的过程中,尽量把工具类,BaseActivity 放在指定的位置,

DateFormat
Bitmap
Notification
Shared Preference
Environment
Device

三:

2.2 Task管理

线程只是一种机制,保证我们要完成的任务不运行在UI线程(也就是说不阻塞UI),完成的任务才是我们关注的核心,因此,我们可以通过设计,把线程封装,让使用者根本感觉不到是线程,他只用关心他要做的事情就行了。
这里,我们可以设计一种”异步链式调用”的框架,把线程进行了封装。使用都只需要这样用:

1
2
3
4
5
new TaskManager()
.next(task1)
.next(task2)
.next(task3).
.execute();

这里,task1, task2, task3是顺序执行的,举个例子:我们要访问网络,取得一个图片,使用这个TaskManager我们需要3个task,

task1:显示一个ProgressDialog。

task2:访问网络,创建bitmap。

task3:关闭对话框,显示bitmap。

这一点,可以参考CoreLib工程中的task.TaskManager类。

关于TaskManager,有以下几点需要注意:

-封装了线程
让调用者只关注自己的业务处理
保证顺序链式地执行某一个任务
上一个任务的输出,作为下一个任务的输入
能暂停、恢复任何一个任务


四: 

2.3 缓存设计

-把内存占用量大的对象存放在缓存中,如bitmap
利用了LruCache类来实现
利用了AsyncTask类来加载bitmap
不用再手动释放bitmap内存,该操作有风险
不用再关心AbsListView的scroll状态
关于缓存的更多详细细节,请参考[ 请参考CoreLib工程中的cache包 ]。

这样做,有什么好处, 不用再手动释放bitmap内在,该操作有风险,因为该bitmap是否有View引用,如果当一个View在试图绘制一个已经回收的bitmap,这里会抛出异常。

五:

2.4 线程管理

无消息循环的线程:

1
2
3
4
5
6
new Thread(null, new Runnable() {
    public void run() {
        // Do you works.
    }

}, "Thread_name_xxx").start();

什么情况下使用这种线程:

-做完一件事情就结束,这件事发生频率不高,比如从SD card中读取图片数据
不需要复用线程

在使用线程,最好给线程加上名字,这样利用高度与跟踪。

有消息循环的线程:

这样的线程拥有消息循环,当消息队列中没有消息时,这个线程会被挂起。我们要做一件事情时,只需要给它发送一个消息就行了。

这种情况通常是为了复用线程,不用频繁创建线程,比如音乐播放器程序,专门启动一个有消息循环的线程来获得音乐的专辑图片。

我们通常还要创建一个与这个线程的消息循环(Looper)相关联的Handler,由它来处理消息,注意,这做的事情是运行在后台线程的。