zoukankan      html  css  js  c++  java
  • android事务队列处理的实现

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

  • 相关阅读:
    TCP /IP协议的理解
    Linux 文件大小跟踪命令
    关于3D旋转的本质
    Unity旋转
    QT解析XML(机械拆装)
    红黑树总结
    EXCEPTIONS
    算数运算符注意事项
    java中常用的转义字符
    常量和数据类型
  • 原文地址:https://www.cnblogs.com/demodashi/p/10480178.html
Copyright © 2011-2022 走看看