文档详情

Android网络业务的封装与调度.doc

发布:2017-09-18约1.74万字共22页下载文档
文本预览下载声明
Android网络业务的封装与调度 手机客户端程序由于网络宽带的约束,尤其在GPRS网络环境下,大数据量的网络交互很大程度上降低应用的响应,影响用户体验。比如,如果做一个手机网盘客户端,在后台上传文件时(大数据量的交互),获取文件列表(命令类的交互)这个过程就显得太别慢。而我们的要求是希望这些命令类操作能尽快得到响应。 通常,在手机客户端,我们设计一个网络操作的管理器,来统一管理这些需要联网的操作。 具体做法是把网络操作封装成一个Command(或者说是Task),管理器实现特定的调度规则来调度运行这些Task。 这样做的好处至少有三: 一. 用Command封装了网络操作,使得这些操作与上传的业务分离,解除了强耦合。 二. 可以根据网络情况来确定来采用不同的调度规则,提高用户体验。 三. 重用,这些Task和TaskManager的代码在别的手机应用上基本上能照搬过去。 四.?扩展,当应用需要扩展新的业务时,只有扩展一个新的Command(或者说是Task),接受调度即可,易于扩展。 ? 例子: 还是以上文提到的微盘为例,可以概括我们对管理器的设计要求有: 在Wifi网络环境下: 一:各种网络操作可以并行运行。 在GPRS网络环境下: 二:支持优先级抢占调度,命令类操作的优先级比数据传输类的优先级高,当命令类的Task(获取文件列表)提交后,打断数据传输的Task(如上传,下载),等命令类的任务运行完毕,再接着运行数据类任务(断点上传,下载)。 二:同一个优先级的任务可以并行运行,如多个命令一起在网络上传输。 ? 实现思路: TaskManager?: 1. TaskManager开辟一个后台线程进行调度工作。 2. 由于要支持多个优先级的抢占调度,我们需要两个队列来维护运行中的Task和等待中的Task。 3. 由于Task的调度是基于优先级的,我们可以使用优先级队列,运行队列采用PriorityQueue,等待队列使用PriorityBlockingQueue,当没有网络业务需要运行时,调度线程阻塞挂起,避免空转。 4.?TaskManager设计为单一实例(单一模式)。 5. 每个Task被调度运行时,该Task被从等待队列移动运行队列,当Task执行完毕时,从运行队列删除,唤醒调度线程进行新的调度。 下面是简单的设计代码: ? public final class TaskEngine implements Runnable{ ? private PriorityQueueTask runningQueue;//运行的task队列 ? private PriorityBlockingQueueTask readyQueue;//就绪的task队列,准备接受调度的task列表 ? private final AtomicLong taskIdProducer = new AtomicLong(1);//Task Id生成器 ? private Object sheduleLock = new Object();//同步锁 ? private static TaskEngine instance; ? public long addTask(BusinessObject bo){   Task task = new Task(bo);   long newTaskId = taskIdProducer.incrementAndGet();   task.setTaskId(newTaskId);   if(this.isWifiNetWork()){ //WIFI网络   synchronized(sheduleLock){   runningQueue.add(task);   }   new Thread(task).start();   }else{ //GPRS网络   if(readyQueue.offer(task)){ //task入就绪队列   final ReentrantLock lock = this.lock;   lock.lock();   try{   needSchedule.signal(); //唤醒调度线程重新调度   }finally{   lock.unlock();}   } } return newTaskId; } ? public final void run(){//task调度逻辑 .... .... } ? //挂起调度线程 当不需要调度时 private void waitUntilNeedSchedule() throws InterruptedException { ..... } } ? Task: ? 1. 对要执行的网络操作的封装。 ? 2. Task
显示全部
相似文档