代码地址如下:
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

最新文章

  1. Eclipse 报java.lang.OutOfMemoryError: PermGen space错
  2. AOD.net
  3. 【高斯消元】BZOJ 1770: [Usaco2009 Nov]lights 燈
  4. POJ 2115 C Looooops(扩展欧几里得)
  5. bzoj 3720: Gty的妹子树 块状树
  6. POJ 2528 Mayor&#39;s posters(线段树)
  7. ASP.NET Excel数据导入数据库
  8. mongodb 排序 Unable to determine the serialization information for the expression 异常
  9. Nodejs 发送短信验证码
  10. POJ 2524 并查集
  11. Rhythmbox中文乱码解决的方法
  12. 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)
  13. Ubuntu 服务器443端口证书配置
  14. rocketmq双主模式
  15. 在C++中,子类重载一个操作符时,如何调用父类被重载的操作符函数
  16. DataGrid 查出一个列 按要求显示格式 例如:操作人(地点)
  17. tabindex 带有指定 tab 键顺序 或焦点 focus
  18. Codeforces 958C3 - Encryption (hard)
  19. Python NLTK——python与nltk配置
  20. delphi 域名转ip并判断ip是否可以联通

热门文章

  1. RateLimiter
  2. 从客户端(SeekingJobs=&quot;&lt;B&gt;&#183;&lt;/B&gt; 物流规划,&lt;B&gt;&#183;&lt;/...&quot;)中检测到有潜在危险的 Request.Form 值。
  3. Html 列表 li ul使用
  4. HTML中的转义字符 (转)
  5. [leetcode]Text Justification @ Python
  6. Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class
  7. 泊松分布E(X^2)
  8. Windows10 安装Jupyter
  9. 九度oj-1001-Java
  10. jquery操作select(取值,设置选中)(转)