android 状态管理与前后台通信代码片段

42 篇文章 0 订阅

给出我自己写的一个小小的状态管理,也可以说是前后台通信的模块。首先我们还是来看看效果

简单说明一下其实这个就是我自己写的一个lib方面以后的前后台通信或者状态改变之间的通信,我们来看看它的代码结构吧。

比较简单就几个简单的类,最主要的就是StateManager.java这个文件那么我就来看看这个类。

package com.bobo.StateManager;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import android.util.Log;

/**
 * 为andorid的activity或者fragment提供或者任意代码片段提供交互
 * @author bobo
 *
 */
public class StateManager {
	/**
	 * 描述类
	 * @author bobo
	 *
	 */
	class Register {
		public String Tag;
		public Object regist;

		public Register(String tag, Object regist) {
			// TODO Auto-generated constructor stub
			this.Tag = tag;
			this.regist = regist;
		}
	}

	//	private ExecutorService executorService = Executors.newCachedThreadPool();//创建线程池
	private List<Register> registereds;//当前注册的registered
	private static volatile StateManager defaultInstance;//单例

	private static String TAG = "StateManagerTag";

	private StateHandler statehandler;

	private String CallMethod = "StateOnPosted";

	/**
	 * 反射调用方法
	 */
	public void invokeEvent(QueueMessage message) {
		//		if(Looper.myLooper() != Looper.getMainLooper())
		//			methed = "StateOnBackgroundThread";
		for (Register key : registereds) {
			Object register = key.regist;
			Method methodi = findinvokeMethed(register);
			//methodi = cla.getMethod("StateOnMainThread", BaseState.class);
			try {
				if (null != methodi)
					methodi.invoke(register, message.baseState);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * 反射调用方法
	 * @param tag
	 * @param baseState
	 */
	public void invokeEventByTag(QueueMessage message) {
		Register register = findDescribe(message.tag);
		if (register != null) {
			Method methodi = findinvokeMethed(register.regist);
			if (methodi != null)
				try {
					methodi.invoke(register.regist, message.baseState);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();

				}
		}
	}

	/**
	 * 找到调用的方法
	 * @param register
	 * @return
	 */
	private Method findinvokeMethed(Object register) {
		Class<?> cla = register.getClass();
		Method methodi = null;
		try {
			Method methods[] = cla.getMethods();
			for (Method method : methods) {
				if (method.getName().equals(CallMethod)) {
					methodi = method;
					break;
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return methodi;

	}

	/**
	 * 发送post通知
	 * @param manager
	 */
	public void post(BaseState baseState) {
		post(null, baseState);
	}

	/**
	 * 更据tag发送post通知
	 * @param tag
	 * @param baseState
	 */
	public void post(String tag, BaseState baseState) {
		statehandler.enQuene(new QueueMessage(tag, baseState));
	}

	/**
	 * 注册Tag
	 * @param Tag
	 * @param object
	 */
	public synchronized void registe(String Tag, Object object) {
		if (null == findDescribe(Tag))//防止重复注册
			registereds.add(new Register(Tag, object));
		else {
			Log.i(TAG, Tag + "重复注册");
		}
	}

	public void registe(Object object) {
		registe(object.getClass().getSimpleName(), object);
	}

	/**
	 * 注销注册的代码片段
	 * @param object
	 */
	public void unregiste(Object object) {
		if (registereds != null && registereds.size() >= 1) {
			registereds.remove(object);
			Log.i(TAG, "unregiste " + object.toString());
		}
	}

	/**
	 * 判断是否已注册
	 * @param object
	 * @return
	 */
	private Register findDescribe(String object) {
		Register registe = null;
		if (registereds != null && registereds.size() >= 1)
			for (Register register : registereds) {
				if (register.Tag.equals(object)) {
					registe = register;
					break;
				}
			}
		return registe;
	}

	/**
	 * 私有构造方法
	 */
	private StateManager() {
		registereds = new ArrayList<Register>();
		statehandler = new StateHandler();
	}

	/**
	 * 单例方法
	 * @return
	 */
	public static StateManager getDefault() {
		if (defaultInstance == null) {
			synchronized (StateManager.class) {
				if (defaultInstance == null) {
					defaultInstance = new StateManager();
				}
			}
		}
		return defaultInstance;
	}
}
这个类主要是用来注册class和发送状态通知,通过StateManager.getDefault().registe(this);这个方法或者StateManager.getDefault().registe(tag,this);这个方法来进行需要注册的类,提供这两种注册方法的原因是考虑到有些状态不需要全局发送,就是不需要每个class都监听到,所以可以通过post(Tag,BaseState);这个方法来像指定tag发送信息。然后我们看看是怎么实现的。
package com.bobo.StateManager;

/**
 * 基类状态
 * @author bobo
 *
 */
public abstract class BaseState {

}
这个类是个基类状态可以通过继承这个类来实现自己的功能,然后在看看其他的。
package com.bobo.StateManager;

import java.util.ArrayList;
import java.util.List;

/**
 * post queue
 * @author bobo
 *
 */
public class PostQueue {

	private List<QueueMessage> messagequeues = new ArrayList<QueueMessage>();
	public void add(QueueMessage baseState) {
		messagequeues.add(baseState);
	}

	public int size() {
		return messagequeues.size();
	}

	public void remove(BaseState baseState) {
		messagequeues.remove(baseState);
	}

	public void removeall() {
		messagequeues.clear();
	}

	public void remove(int position) {
		messagequeues.remove(position);
	}

	public QueueMessage poll() {
		if (messagequeues.size() >= 1)
			return messagequeues.remove(0);
		else
			return null;
	}
}
这个就是一个消息队列的类,每次通过poll方法取消息队列头的信息。

package com.bobo.StateManager;

import android.os.Handler;
import android.os.Message;

public class StateHandler extends Handler {
	private PostQueue postQueue = new PostQueue();

	/**
	 * 入队操作
	 */
	public void enQuene(QueueMessage baseState) {
		postQueue.add(baseState);
		sendMessage(obtainMessage());
	}

	@Override
	public void handleMessage(Message arg0) {
		// TODO Auto-generated method stub
		super.handleMessage(arg0);
		while (true) {
			QueueMessage message = postQueue.poll();
			if (message == null)
				return;
			else {
				if (message.tag == null) //当这个事件没有进行tag注册的时候通知全部发送
					StateManager.getDefault().invokeEvent(message);
				else
					//对进行了tag处理的下发
					StateManager.getDefault().invokeEventByTag(message);
			}
		}
	}
}

然后就是这个handler类主要实现的方法的派发和反射调用,根据是不是需要对Tag分类下发。

package com.bobo.StateManager;

/**
 * 队列信息
 * @author bobo
 *
 */
public class QueueMessage {
	public BaseState baseState; //队列事件
	public String tag;//事件标记

	public QueueMessage(String tag, BaseState baseState) {
		// TODO Auto-generated constructor stub
		this.tag = tag;
		this.baseState = baseState;
	}
	
}

最后这个就是队列消息类。

上面的代码都非常简单也写了很多注视。当我们要使用这个StateManager的时候就变得非常简单了。可以把它做成lib然后在其它工程时候调用,达到了代码复用。

下面我就来讲一讲怎么使用。我们还是老规矩上代码。

public class MainActity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mainlayout);
		StateManager.getDefault().registe(this);

		Intent intent = new Intent(MainActity.this, TestService.class);
		startService(intent);

		//	StateManager.getDefault().registe("mytage", this);//注册带tag
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		StateManager.getDefault().unregiste(this);
	}

	public void onclick(View view) {
		switch (view.getId()) {
		case R.id.sendnotag:
			StateManager.getDefault().post(new Mystate(true)); //发送不带tag的状态
			break;
		case R.id.senddef:
			StateManager.getDefault().post(new Yourstate()); //发送不带tag的不同状态
			break;
		case R.id.sendtag:
			StateManager.getDefault().post("mytage", new Mystate(true)); //发送带tag的状态
			break;
		}
	}

	class Mystate extends BaseState {
		public boolean is;
		public String HH = "my state hello";

		public Mystate(boolean is) {
			// TODO Auto-generated constructor stub
			super();
			this.is = is;
		}
	}

	class Yourstate extends BaseState {
		public String Tag = "YourState";
	}

	/**
	 * 回调方法
	 * @param mystate
	 */
	public void StateOnPosted(BaseState baseState) {
		if (baseState instanceof Mystate) {
			Mystate mystate = (Mystate) baseState;
			Toast.makeText(this, "hello  this is mystate" + mystate.is + " " + mystate.HH, 0).show();
		} else if (baseState instanceof Yourstate) {
			Yourstate yourtast = (Yourstate) baseState;
			Toast.makeText(this, "hello  this is yourstate" + yourtast.Tag, 0).show();
		} else {
			Toast.makeText(this, "hello  this is callback", 0).show();
		}
	}

}
上面的代码非常的简单和明了一开始调用注册函数把class注册到StateManager中然后通过post方法直接通知过来。然后还写了一个Service的测试类不过都一样。
package com.test.activity;

import com.bobo.StateManager.BaseState;
import com.bobo.StateManager.StateManager;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class TestService extends Service {
	private String Tag = "Testservcei";

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		StateManager.getDefault().registe("mytage", this); //注册
		//		StateManager.getDefault().post(new BaseState() {
		//		});
	}

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public void StateOnPosted(BaseState baseState) {
		//Log.i(Tag, "state on service");
		Toast.makeText(this, "Service receved messgae", 0).show();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		StateManager.getDefault().unregiste(this);
	}
}
使用起来是不是很简单啊,不过还有待改进。好了今天就到这里了。这里给出源码的下载地址:https://github.com/shengbo1992/StateManager-android

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值