代码地址如下:
http://www.demodashi.com/demo/14748.html

前言

在android开发中,我们经常会遇到一种情况,随时接收并处理服务端发过来的消息,当服务端发过来的消息时,我们必须全部接收并作出相应的处理。为了处理这种情况,我们今天就来讲下事务对列的实现。

今天涉及的内容有:

  1. 对于服务端发送过来消息的特征分析
  2. 事务队列AffairManager的方法介绍
  3. 事务队列AffairManager的使用步骤
  4. 事务队列AffairManager的使用示例
  5. 项目结构图和效果图
一. 对于服务端发送过来消息的特征分析

服务端发过来的消息一般具有以下特征:

1.随时性:

服务端发送消息情况比较多,例如手机端发起请求,所以客户端进行反馈,还有可能是服务端主动推送,客户端作出反馈。因此,服务端的消息具有随时性

2. 群集性

所谓群集性即指服务端发送过来的消息可能一下子有很多,这就需要我们对它进行队列处理。

二. 事务队列AffairManager的介绍与使用

针对上面的情况,我特地封装了一个事务队列处理的类AffairManager,用于处理随机和群集性事件,下面对AffairManager进行讲解

AffairManager类有这么几个公开方法:

handleAffair(Object obj);

将接收的需要处理的事务添加到事务队列,所有需要经过事务对列处理的对象,都需要先调用此方法添加到事务队列中去。

setOnAffairListener(OnAffairListener onAffairListener);

其中OnAffairListener 接口有两个公开方法:

void doAffair(Object obj);//处理事务
void affairDestroy();//所有事务处理完毕的监听

如上所述,当事务加到队列以后,需要处理的话,即可在 doAffair(Object obj)中进行处理,当所有事务处理完毕后,你需要做什么其他操作,可以在affairDestroy()中进行处理。

updateInUI(Activity activity, Runnable runnable);

当doAffair(Object obj)方法中的处理需要涉及到更新ui的时候,可以在doAffair(Object obj)中调用updateInUI(Activity activity, Runnable runnable)方法用于更新ui

stopAffair();

停止事务队列的处理。当你需要终止事务队列的处理的时候,可以调用此方法,当调用此方法后,添加到队列中的事务将一并清除,如无特殊情况,此方法在程序退出的时候才调用。

三. 事务队列AffairManager的使用步骤

AffairManager具体使用步骤如下:

3.1 初始化AffairManager
private AffairManager mAffairManager;

    @Override
public void initData() {
mAffairManager=new AffairManager();
}
3.2 MainActivity实现在AffairManager.OnAffairListener接口,setListener中实现AffairManager监听
public class MainActivity extends BaseActivity implements AffairManager.OnAffairListener{

    @Override
public void setListener() {
mAffairManager.setOnAffairListener(this);
}
3.3 将要处理的对象添加到事务处理队列

这里用按钮点击模仿接收服务器信息,然后添加到事务队列中

       switch (v.getId()) {
case R.id.btn_add:
LogUtil.i("======我点击了=======");
showShort("添加对象到事务队列");
mAffairManager.handleAffair("我添加了一个");
break;
default:
break;
}
3.4 在doAffair(final Object obj)中处理业务逻辑
   @Override
public void doAffair(final Object obj) {
LogUtil.i("==========obj="+obj+" time="+getNowTime());
//此处处理你的业务逻辑
}

若涉及到ui的处理,你可以这样:

    @Override
public void doAffair(final Object obj) {
LogUtil.i("==========obj="+obj+" time="+getNowTime()); //需要处理ui的时候在doAffair(final Object obj)中调用此方法
mAffairManager.updateInUI(mContext, new Runnable() {
@Override
public void run() {
showShort(obj.toString());
mTvHandle.setText(obj.toString());
}
});
}
3.5 若所有事务处理完毕后,你要做些自己的处理,可以调用affairDestroy(),类似如下:
    @Override
public void affairDestroy() {
LogUtil.i("=======事务处理结束========= time="+getNowTime()); }

若affairDestroy()中涉及ui,你可以这样:

    @Override
public void affairDestroy() {
LogUtil.i("=======事务处理结束========= time="+getNowTime()); //需要处理ui的时候在doAffair(final Object obj)中调用此方法
mAffairManager.updateInUI(mContext, new Runnable() {
@Override
public void run() {
showShort("事务处理结束");
}
});
}
3.6 当不再需要使用事务队列的时候,你可以像下面这样释放它
    @Override
protected void onDestroy() {
super.onDestroy();
if(mAffairManager!=null){
mAffairManager.stopAffair();
}
}
四. 事务队列AffairManager的使用示例

下面以贴出一个事务队列处理的例子,MainActivity代码如下:

package com.android.testdemo.main;

import android.view.View;
import android.widget.Button;
import android.widget.TextView; import com.android.testdemo.R;
import com.android.testdemo.affair.AffairManager;
import com.android.testdemo.base.BaseActivity;
import com.android.testdemo.utils.LogUtil;
import com.android.testdemo.utils.ToastUtil; import java.text.SimpleDateFormat;
import java.util.Date; import butterknife.BindView; public class MainActivity extends BaseActivity implements AffairManager.OnAffairListener{ @BindView(R.id.btn_add)
Button mBtnAdd;
@BindView(R.id.btn_stop)
Button mBtnStop;
@BindView(R.id.textView)
TextView mTvHandle; private AffairManager mAffairManager; @Override
public int getContentViewId() {
return R.layout.activity_main;
} @Override
public void initData() {
mAffairManager=new AffairManager();
} @Override
public void setListener() {
mBtnAdd.setOnClickListener(this);
mBtnStop.setOnClickListener(this);
mAffairManager.setOnAffairListener(this);
} @Override
public void onClick(View v) {
super.onClick(v);
switch (v.getId()) {
case R.id.btn_add:
LogUtil.i("======我点击了=======");
showShort("添加10个");
for(int i=0;i<10;i++){
mAffairManager.handleAffair("我是第 "+(i+1)+" 个");
}
break;
case R.id.btn_stop:
showShort("停止事务");
mAffairManager.stopAffair();
break;
default:
break;
}
} private void showShort(String msg){
ToastUtil.shortShow(mContext,msg);
} @Override
public void doAffair(final Object obj) {
LogUtil.i("==========obj="+obj+" time="+getNowTime()); //需要处理ui的时候在doAffair(final Object obj)中调用此方法
mAffairManager.updateInUI(mContext, new Runnable() {
@Override
public void run() {
showShort(obj.toString());
mTvHandle.setText(obj.toString()); }
});
} @Override
public void affairDestroy() {
LogUtil.i("=======事务处理结束========= time="+getNowTime()); //需要处理ui的时候在doAffair(final Object obj)中调用此方法
mAffairManager.updateInUI(mContext, new Runnable() {
@Override
public void run() {
showShort("事务处理结束");
}
});
} private String getNowTime(){
Date d2 = new Date();
long longtime2 = d2.getTime();
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
String date = format.format(longtime2);
return date;// 2012年10月03日 23:41:31
} @Override
protected void onDestroy() {
super.onDestroy();
if(mAffairManager!=null){
mAffairManager.stopAffair();
}
}
}

MainActivity对应的main_activity.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context="com.android.testdemo.main.MainActivity"> <Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="添加"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:textSize="@dimen/sp_16"
android:textColor="@color/red"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> <Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="停止事务"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_add" />
</android.support.constraint.ConstraintLayout>
五. 项目结构图和效果图

项目结构图

效果图



android事务队列处理的实现

代码地址如下:
http://www.demodashi.com/demo/14748.html

android事务队列处理的实现的更多相关文章

  1. mysql 事务队列 写入 幂等性 重复写入

    mysql  事务队列   写入 幂等性  重复写入

  2. Android消息队列和Looper

    1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消息(Message)代表一个行为(what ...

  3. Android 消息队列机制

    在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤: 创建Looper Looper.prepar() 创建Handler 启动消息循环Looper.loop() 通过这3步,基本就 ...

  4. Android——事务

    一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结 ...

  5. Android 开发笔记 “Android 的消息队列模型”

    Android是参考Windows的消息循环机制来实现Android自身的消息循环的. Android通过Looper.Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都 ...

  6. Android 的消息队列模型

    Android 的消息队列模型 Android是参考Windows的消息循环机制来实现Android自身的消息循环的.    Android通过Looper.Handler来实现消息循环机制,Andr ...

  7. WCF揭秘学习笔记(4):可信赖会话、会话管理、队列、事务

    可信赖会话 WCF的可信赖会话在绑定层保证消息只会被传输一次,并且保证消息间的顺序.当使用TCP通信时,协议本身保证了可靠性,但它只在两点间的网络 包这个层面提供了这样的保证.WCF的可信赖会话特性保 ...

  8. Android 第三方

    把优酷.土豆等取出它们真是的视频播放地址:http://vparser.com/ volley 项目地址 https://github.com/smanikandan14/Volley-demo (1 ...

  9. Redis学习笔记(4) Redis事务、生存时间及排序

    1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次 ...

随机推荐

  1. 多线程学习-ListenableFuture使用介绍以及示例

    Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展.ListenableFuture顾名思义就是可以监听的Futu ...

  2. 算法: 实现LRU缓存,读取、写入O(1)实现

    这题应该见的不少了,写写记录一下. 实现该功能分析: (1) O(1) 时间完成查找,那除了 hash 别无选择. (2) LRU 最近最少使用算法,为了方便数据的淘汰.需要对最近访问的数据放未访问数 ...

  3. 轻松搞定 easyui datagrid 二次加载的问题(转)

    对于使用url方式的初学者,经常碰到重复请求的问题,这个问题的根源是因为一旦设置了url参数,Datagrid组件在实例化的时候就会做请求,如何避免二次加载这样问题呢,个人觉得注意以下两点基本就可以防 ...

  4. 如何查看Isilon节点的硬件信息?

    Isilon节点虽然是一个Linux,但是很多linux下常用的命令都没有,比如说看内存的.笔者经过试验,列出了一些可用的命令. 查看硬件状态 isi_hw_status 查看内存 sysctl hw ...

  5. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  6. List 集合的交集

    private void Test() { List<string> lsA = new List<string>(); lsA.Add("A"); lsA ...

  7. WordPress 获取指定分类ID的分类信息

    get_term:直接从数据库中获取分类信息get_the_category:使用post_id作为参数,先根据post_id查询对应的文章然后再返回对应的分类信息,如果没有文章信息则返回Null 之 ...

  8. Web项目MySQL配置文件运维

    root@mysqltest:/etc/mysql/mysql.conf.d# cat mysqld.cnf # # The MySQL database server configuration f ...

  9. (转)Unity3D研究院之IOS&Android收集Log文件

    转自:http://www.xuanyusong.com/archives/2477 有段时间没有写过文章了,不知道大伙儿还记得雨松MOMO吗? 嘿嘿. 开发项目的时候尤其在处理与服务器交互这块,如果 ...

  10. java 大文件上传 断点续传 完整版实例 (Socket、IO流)

    ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...