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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM