作者:XINHAO_HAN
大家有時(shí)候想在Android當(dāng)中之間的Activity來(lái)回傳遞數(shù)據(jù),是不是很費(fèi)勁,Intent的傳遞確實(shí)勇氣來(lái)不錯(cuò),
但問(wèn)題是只能一層一層傳遞,
可能你在寫那個(gè)過(guò)程P(劈)X(叉)了,找起來(lái)真的那心疼的要死啊.....
第一種方式:單例模式
原理:單例模式,它可以在Android[APK]當(dāng)中的任意一個(gè)Activity當(dāng)中取出數(shù)據(jù),因?yàn)樗鼉?nèi)存中就它一個(gè)對(duì)象,你是不是很爽啊 0.0
例子[單例模式]
package com.jiuhong.redcabinet.utils.eventbus;
/**
* XINHAO_HAN
*/
public class DLdATA {
private static DLdATA dLdATA;
public static DLdATA getInstall() {
if (dLdATA == null) {
synchronized (DLdATA.class) {
if (dLdATA == null) {
dLdATA = new DLdATA();
return dLdATA;
} else {
return dLdATA;
}
}
} else {
return dLdATA;
}
}
/**
* 這塊寫你要傳遞的數(shù)據(jù)
*/
public String test = "測(cè)試";
}
這樣你可以在任意一個(gè)Activity當(dāng)中取到數(shù)據(jù)了
就這樣
/**
* A Class
*/
class A{
public void test(){
DLdATA.getInstall().test = "我是要傳遞的數(shù)據(jù)";
}
}
/**
* B Class
*/
class B{
public void test(){
//這塊就打印出來(lái)了
System.out.println(DLdATA.getInstall().test);
}
}
[圖片上傳中...(無(wú)標(biāo)題.png-e2aa1f-1512715726678-0)]
給大家普及一下單例模式
1.餓漢式
2.懶漢式 [線程安全/不安全/利用靜態(tài)代碼塊new]
3.枚舉
4.內(nèi)部類模式
這些大家都可以上網(wǎng)查查
下面是重點(diǎn)了 //-------------------------------------------------------------------------------------------XHEventBus
仿照EventBus[超級(jí)簡(jiǎn)單版,總體代碼不超過(guò)80行]
//大致流程和EventBus相差不多
//但EventBus有一個(gè)缺點(diǎn),就是當(dāng)你一個(gè)類未注冊(cè),EventBus的Map集合中就沒有你要調(diào)用的那個(gè)類,所以必須是在你注冊(cè)之后發(fā)送消息,而不能再注冊(cè)之前發(fā)送
//這個(gè)類的機(jī)制,就像離線消息一樣,如果你當(dāng)前類沒有被注冊(cè),那么這個(gè)消息就暫時(shí)保存到一個(gè)緩存Map當(dāng)中,相當(dāng)于離線消息
這個(gè)圖
//唉,畫的圖,有點(diǎn)垃圾........
貼代碼:
/**
* XINHAO_HAN自定義數(shù)據(jù)傳輸機(jī)制
*/
public class XHEventBus {
//監(jiān)聽機(jī)制 ---這個(gè)是正常注冊(cè)的存儲(chǔ)
private static Map<String, InData> objectMap;
//監(jiān)聽機(jī)制 ---這個(gè)是離線消息機(jī)制
private static Map<String, OffLine> offLineMap;
static {
objectMap = new HashMap<String, InData>();
offLineMap = new HashMap<>();
}
/**
* 設(shè)置監(jiān)聽
*/
public static void setListener(XHDatListener xhDatListener) {
InData inData = new InData();
inData.xhDatListener = xhDatListener;
//多次注冊(cè)是無(wú)效的,HashMap集合,不能存儲(chǔ)相同[重復(fù)]數(shù)值
objectMap.put(inData.xhDatListener.getClass().getName(), inData);
getOffLineData(xhDatListener);
LOGE.e("測(cè)試效果", "SIZE大小:" + objectMap.size());
}
/**
* 開始取離線消息
*/
public static void getOffLineData(XHDatListener xhDatListener) {
if (offLineMap.size() == 0)
return;
OffLine offLine = offLineMap.get(xhDatListener.getClass().getName());
if (offLine == null)
return;
xhDatListener.dataComplete(offLine.dataCompleteMessage);
LOGE.e("測(cè)試效果", "離線消息" + offLine.dataCompleteMessage.getObject());
/**
* 處理完成,移除該消息
*/
offLineMap.remove(offLine.aClass.getName());
LOGE.e("測(cè)試效果", "離線消息已移除:" + offLineMap.size());
}
/**
* 移除監(jiān)聽
*/
public static void romeListener(Object o) {
objectMap.remove(o.getClass().getName());
}
/**
* 發(fā)送數(shù)據(jù),如果該類消息已被注冊(cè),就直接發(fā)送該類的消息,如果該類沒有被注冊(cè),那么就存到離線消息庫(kù),等有該類信息被注冊(cè)的時(shí)候就開始調(diào)用
*/
public static void sendData(DataCompleteMessage dataCompleteMessage, Class clazz) {
for (String key : objectMap.keySet()) {
if (TextUtils.equals(key, clazz.getName())) { //如果集合當(dāng)中有,就表示該類已經(jīng)被注冊(cè)過(guò)了,直接發(fā)送消息即可
objectMap.get(key).xhDatListener.dataComplete(dataCompleteMessage);
} else { //如果集合當(dāng)中沒有,那么就代表要發(fā)送的那個(gè)消息類沒有被注冊(cè),所以該消息被保存到離線消息庫(kù)中如果有就調(diào)用
//這塊可能會(huì)多次添加,但由于HashMap的特點(diǎn),不會(huì)添加重復(fù)數(shù)值
saveOffLineMessage(dataCompleteMessage, clazz);
}
}
//如果集合為0,上邊的for可能不會(huì)走
if (objectMap.size() == 0) {
saveOffLineMessage(dataCompleteMessage, clazz);
}
}
/**
* 開始[存]離線消息當(dāng)中的數(shù)據(jù)
*/
private static void saveOffLineMessage(DataCompleteMessage dataCompleteMessage, Class clazz) {
OffLine offLine = new OffLine();
offLine.dataCompleteMessage = dataCompleteMessage;
offLine.inData = new InData();
offLine.aClass = clazz;
offLineMap.put(clazz.getName(), offLine);
LOGE.e("測(cè)試效果", "SIZE[離線]大小:" + offLineMap.size());
}
private static class OffLine {
public DataCompleteMessage dataCompleteMessage;
public InData inData;
public Class aClass;
}
}
//可能有其他的類包含
public class DataCompleteMessage {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
public interface XHDatListener {
void dataComplete(DataCompleteMessage dataCompleteMessage);
}
//這塊是根據(jù)接口自定義的,如果有興趣的老鐵,你可以用反射機(jī)制來(lái)做的更強(qiáng)大一點(diǎn)
---------------------------------------END--------------------------------------