完整方案:命令模式+异步执行+取消机制

引子

  • 随着项目的发展,activity的代码变得越来越庞杂,不易维护。这便出现了诸如MVP等模式来分层实现以达到给activity减负的效果,从而降低业务逻辑的耦合,提高可维护性。本文从另外一个角度出发,利用命令模式来实现给activity瘦身的目标。采用本文的方案,同样可以将业务逻辑抽离,并于后台执行,同时提供了不错的取消机制。

接口

  • iCmd接口,主要api是exe方法,返回值是bundle对象;其他mTag,mCanceled用于取消相关

public abstract class iCmd {
    private boolean mCanceled = false;
    private Object mTag;

    public void cancel() {
        mCanceled = true;
    }

    public boolean isCanceled() {
        return mCanceled;
    }

    public Object getTag() {
        return mTag;
    }

    public iCmd setTag(Object tag) {
        mTag = tag;
        return this;
    }

    public abstract Bundle exe() throws Exception;
}
  • iCmdListener 命令监听接口,onPreExecute负责命令开始的通知;onPostExecute负责命令结束的通知并带回返回结果
public interface iCmdListener {
    public void onPreExecute();

//  public void onProgressUpdate(int progress);

    public void onPostExecute(Bundle resultBundle);

}
  • iCmdExecutor命令执行器,下列代码仅列出主要api,具体的实现文后的github地址

public class iCmdExecutor {
//用于取消和具体tag相关的cmd
    public static void cancelAll(final Object tag)

//异步执行该命令,并在主线程执行回调通知
    public static void exeAsync(final iCmd cmd, final iCmdListener listener,
            Object tag)

//同步执行该命令,并在当前线程执行回调通知
    public static void exeSync(iCmd cmd, iCmdListener listener, Object tag)

}

用法

  • 实现具体cmd

public class CmdAdd extends iCmd {
    private static final String TAG = "test";
    private BigInteger a;
    private BigInteger b;

    public CmdAdd(BigInteger a, BigInteger b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public Bundle exe() throws InterruptedException {
        Log.i(TAG, this + ", exe, tid=" + Thread.currentThread().getId());
        Thread.sleep(5000);// demo for long operation
        Bundle bundle = new Bundle();
        bundle.putString("result", a.add(b).toString());
        return bundle;
    }

}
  • 调用该命令
iCmdExecutor.exeAsync(new CmdAdd(new BigInteger("123"), new BigInteger(
                "12345678901234567890123456789012345678901234567890")),
                new iCmdListener() {

                    @Override
                    public void onPreExecute() {
                        Log.e(TAG, "onPreExecute, tid="
                                + Thread.currentThread().getId());
                    }

                    @Override
                    public void onPostExecute(Bundle resultBundle) {
                        Log.e(TAG, "onPostExecute, tid="
                                + Thread.currentThread().getId()
                                + ", resultBundle=" + resultBundle);
                        if (null != resultBundle) {
                            String res = resultBundle.getString("result");
                            tvAddResult.setText(res);
                        }
                    }
                }, this);
  • 在activity退出时取消
iCmdExecutor.cancelAll(this);

链接

时间: 2024-07-31 14:23:32

完整方案:命令模式+异步执行+取消机制的相关文章

Android AsyncTask内部线程池异步执行任务机制简要分析

如下分析针对的API 25的AsyncTask的源码: 使用AsyncTask如果是调用execute方法则是同步执行任务,想要异步执行任务可以直接调用executeOnExecutor方法,多数情况下我们会使用AsyncTask内部静态的线程池, THREAD_POOL_EXECUTOR,这里并不是要分析AsyncTask内部的流程,而是简单介绍下线程池的工作流程.可以看到THREAD_POOL_EXECUTOR的配置如下: new ThreadPoolExecutor( CORE_POOL_

关于异步执行

异步执行模式 异步执行模式,是指语句在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同. 例如 查询操作,客户机上的应用程序在向服务器发出了查 询操作的指令后,将立刻执行查询语句指令的下一条 语句,而不需要等到服务器将查询结果返回客户机端.异步执行方式使应用程序能摆 脱单个任务的牵制,提高了灵活性和应用程序的执行 效率.但异步执行模式也存在一些问题,如它增加了编程的复杂性,特别是编写互用性(interoperable)要求较高 的程序. 在负荷很重的客户/服务器系 统中,适宜

【GOF23设计模式】命令模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_命令模式.数据库事务机制底层架构实现.撤销和回复 1 package com.test.command; 2 3 public class Receiver { 4 public void action(){ 5 System.out.println("Receiver.action()"); 6 } 7 } 1 package com.test.command; 2 3 public interface C

JAVA设计模式(15):行为型-命令模式(Command)

介绍 命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.也称之为:动作Action模式.事务transaction模式. 结构 Command抽象命令类 定义命令的接口,声明执行的方法. ConcreteCommand具体命令类 命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作. Invoker调用者/请求者 请求的发送者,它通过命令对象来执行请求.一个调用者并不需

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

多线程场景设计利器:分离方法的调用和执行——命令模式总结

前言 个人感觉,该模式主要还是在多线程程序的设计中比较常用,尤其是一些异步任务执行的过程.但是本文还是打算先在单线程程序里总结它的用法,至于多线程环境中命令模式的用法,还是想在多线程的设计模式里重点总结. 实现思路 其实思路很简单,就是把方法的请求调用和具体执行过程分开,让客户端不知道该请求是如何.何时执行的.那么如何分开呢? 其实没什么复杂的,就是使用 OO 思想,把对方法的请求封装为对象即可,然后在设计一个请求的接受者对象,当然还要有一个请求的发送者对象,请求本身也是一个对象.最后,请求要如

Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe AIR中使用Flex连接Sqlite数据库(3)(查询) Adobe AIR中使用Flex连接Sqlite数据库(4)(事务) Flex,Fms3相关文章索引 Fms3和Flex打造在线多人视频会议和视频聊天(附原代码) 免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码))

Python开发【项目】:RPC异步执行命令(RabbitMQ双向通信)

RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 本节涉及最多的还是rabbitmq通信原理知识,要求安装rabbitmq服务 程序用广播topic模式做更好 程序目录结构: 程序简介: # 异步rpc程序 ## 1.需求 - [ ] 利用RibbitMQ进行数据交互 - [ ] 可以对多台服务器进行操作 - [ ] 执行命令后不等待命令的执行结果,而是直接让输入下一

异步执行的运行机制

异步执行的运行机制如下.(同步执行也是如此,因为它可以被视为没有异步任务的异步执行.) (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack). (2)主线程之外,还存在一个"任务队列"(task queue).只要异步任务有了运行结果,就在"任务队列"之中放置一个事件. (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件.那些对应的异步任务