中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

如何進(jìn)行網(wǎng)站維護(hù)seo云優(yōu)化如何

如何進(jìn)行網(wǎng)站維護(hù),seo云優(yōu)化如何,中國(guó)工程機(jī)械網(wǎng)官網(wǎng),網(wǎng)站制作教程手機(jī)一、概念 EventBus是一款在 Android 開(kāi)發(fā)中使用的發(fā)布-訂閱事件總線框架,基于觀察者模式,將事件的接收者和發(fā)送者解耦,簡(jiǎn)化了組件之間的通信,使用簡(jiǎn)單、效率高、體積小。 一句話:用于Android組件間通信的。 二、原理…

一、概念

EventBus是一款在 Android 開(kāi)發(fā)中使用的發(fā)布-訂閱事件總線框架,基于觀察者模式,將事件的接收者和發(fā)送者解耦,簡(jiǎn)化了組件之間的通信,使用簡(jiǎn)單、效率高、體積小。

一句話:用于Android組件間通信的。

二、原理

image.png

三、簡(jiǎn)單使用

  • 在app module的builde.gradle文件中導(dǎo)入依賴庫(kù):
implementation 'org.greenrobot:eventbus:3.3.1'
  • 配置混淆
-keepattributes *Annotation*
-keepclassmembers class * {@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {<init>(java.lang.Throwable);
}

1、訂閱者EventBusService后臺(tái)注冊(cè),前臺(tái)EventBusActivity 發(fā)送的數(shù)據(jù)。注冊(cè)以后一定要記得解注冊(cè),否則會(huì)內(nèi)存泄漏。onMsgEventReceived是接收消息的方法,該方法定義需要注意:

  • 該方法有且僅有一個(gè)參數(shù);
  • 必須用public修飾,不能使用static或者abstract
  • 需要添加@Subscribe()注解;
public class EventBusService extends Service {private static final String TAG = "Test_EventBusService";@Overridepublic void onCreate() {super.onCreate();//注冊(cè)數(shù)據(jù)監(jiān)聽(tīng)EventBus.getDefault().register(this);}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Subscribepublic void onMsgEventReceived(String msg) {Log.i(TAG, "String msg: " + msg);}@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)public void onMsgEventReceived(MsgEvent event) {Log.i(TAG, "MsgEvent msg: " + event.getMsg());}@Overridepublic void onDestroy() {super.onDestroy();//解注冊(cè)數(shù)據(jù)監(jiān)聽(tīng)EventBus.getDefault().unregister(this);}
}

2、前臺(tái)Activity在按鈕點(diǎn)擊的時(shí)候發(fā)送信息到后臺(tái)Service。

public class EventBusActivity extends AppCompatActivity {private static final String TAG = "Test_EventBusActivity";@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_event_bus);Button msg1Btn = findViewById(R.id.btn1);Button msg2Btn = findViewById(R.id.btn2);msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者EventBus.getDefault().post("msg1 - coming!!!");}});msg2Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者MsgEvent event = new MsgEvent("msg2 - coming!!!");EventBus.getDefault().post(event);}});}@Overrideprotected void onDestroy() {super.onDestroy();}
}

3、MsgEvent數(shù)據(jù)類型。

public class MsgEvent {private String msg;public MsgEvent(String msg) {this.msg = msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}@Overridepublic String toString() {return "MsgEvent{" +"msg='" + msg + '\'' +'}';}
}

4、運(yùn)行結(jié)果
運(yùn)行結(jié)果.png

四、Subscribe注解

Subscribe是EventBus自定義的注解,共有三個(gè)參數(shù)(可選):ThreadModeboolean sticky、int priority

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
public void onMsgEventReceived(MsgEvent event) {Toast.makeText(this, event.getMsg(), Toast.LENGTH_LONG).show();
}

1、ThreadMode取值:

  • ThreadMode.POSTING:默認(rèn)的線程模式,在哪個(gè)線程發(fā)送事件就在對(duì)應(yīng)線程處理事件。避免了線程切換,效率高。

代碼測(cè)試:

#EventBusActivity 
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者new Thread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}}).start();}});#EventBusService
@Subscribe
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

post的動(dòng)作放到子線程中,結(jié)果如下,在哪個(gè)線程發(fā)送,就會(huì)在哪個(gè)線程執(zhí)行:
Thread.POSTING.png

  • ThreadMode.MAIN:如在主線程(UI線程)發(fā)送事件,則直接在主線程處理事件;如果在子線程發(fā)送事件,則先將事件入隊(duì)列,然后通過(guò)Handler切換到主線程,依次處理事件。

該模式下,在主線程(UI線程)發(fā)送事件,則直接在主線程處理事件,如果處理方法中有耗時(shí)操作就會(huì)堵塞進(jìn)程。

代碼測(cè)試1:

#EventBusActivity 
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者new Thread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}}).start();}});#EventBusService
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

發(fā)送post代碼放到子線程中,處理事件代碼加上ThreadMode.MAIN注解參數(shù),結(jié)果如下,可以用在子線程處理耗時(shí)操作,然后返回值需要切回到主線程刷新UI的場(chǎng)景:
Thread.MAIN.png
代碼測(cè)試2:

#EventBusActivity 
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1-1 - coming!!!");}});#EventBusService
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);try {Thread.sleep(2 * 1000);} catch (InterruptedException e) {e.printStackTrace();}
}

發(fā)送post放在主線程并連續(xù)發(fā)送兩次,接收事件的函數(shù)加上耗時(shí)操作,運(yùn)行結(jié)果如下,兩次post打印就相隔2s,第二次post需要等第一次事件接收處理完以后才能發(fā)出,所以主線程會(huì)阻塞:
Thread.MAIN_阻塞.png

同樣修改下發(fā)出post的代碼放到子線程后沒(méi)有這個(gè)問(wèn)題,結(jié)果如下:
Thread.MAIN_子線程非阻塞.png

  • ThreadMode.MAIN_ORDERED:無(wú)論在那個(gè)線程發(fā)送事件,都先將事件入隊(duì)列,然后通過(guò) Handler 切換到主線程,依次處理事件。
    代碼測(cè)試:
#EventBusActivity 
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1-1 - coming!!!");}});#EventBusService
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);try {Thread.sleep(2 * 1000);} catch (InterruptedException e) {e.printStackTrace();}
}

代碼和ThreadMode.MAIN測(cè)試2一樣,只是將threadMode改為了MAIN_ORDERED,運(yùn)行結(jié)果如下,兩次post可以連續(xù)發(fā)出:
MAIN_ORDERED.png

  • ThreadMode.BACKGROUND:如果在主線程發(fā)送事件,則先將事件入隊(duì)列,然后通過(guò)線程池依次處理事件;如果在子線程發(fā)送事件,則直接在發(fā)送事件的子線程處理事件。
    代碼測(cè)試1:
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}});#EventBusService
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

運(yùn)行結(jié)果如下,主線程發(fā)送事件,線程池依次處理事件:
ThreadMode.BACKGROUND.png

代碼測(cè)試2:

msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者new Thread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}}).start();}});#EventBusService
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

運(yùn)行結(jié)果,子線程發(fā)送事件,則直接在發(fā)送事件的子線程處理事件:
ThreadMode.BACKGROUND_子線程.png

  • ThreadMode.ASYNC:無(wú)論在那個(gè)線程發(fā)送事件,都將事件入隊(duì)列,然后通過(guò)線程池處理。
    代碼測(cè)試1:
msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}});#EventBusService
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

運(yùn)行結(jié)果,主線程發(fā)送,線程池處理:
ThreadMode.ASYNC_主線程.png
代碼測(cè)試2:

msg1Btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//發(fā)送數(shù)據(jù)給監(jiān)聽(tīng)者new Thread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "post thread: " + Thread.currentThread().getName());EventBus.getDefault().post("msg1 - coming!!!");}}).start();}});#EventBusService
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMsgEventReceived(String msg) {Log.i(TAG, "onMsgEventReceived thread: " + Thread.currentThread().getName());Log.i(TAG, "String msg: " + msg);
}

運(yùn)行結(jié)果,子線程發(fā)送,線程池處理:
ThreadMode.ASYNC_子線程.png

2、sticky:

sticky是否為粘性監(jiān)聽(tīng),boolean類型,默認(rèn)值為false。正常我們都是先訂閱,才能接收到發(fā)出的事件,sticky的作用就是訂閱者可以先不進(jìn)行注冊(cè),事件先發(fā)出,再注冊(cè)訂閱者,同樣可以接收到事件,并進(jìn)行處理。

3、priority:

priority是優(yōu)先級(jí),int類型,默認(rèn)值為0。值越大,優(yōu)先級(jí)越高,越優(yōu)先接收到事件。值得注意的是,只有在post事件和事件接收處理,處于同一個(gè)線程環(huán)境的時(shí)候,才有意義。

參考文章
EventBus詳解 (詳解 + 原理)

http://www.risenshineclean.com/news/35716.html

相關(guān)文章:

  • 動(dòng)態(tài)網(wǎng)站設(shè)計(jì)與開(kāi)發(fā)心得體會(huì)貴陽(yáng)關(guān)鍵詞優(yōu)化平臺(tái)
  • 齊諾網(wǎng)站建設(shè)成都私人做網(wǎng)站建設(shè)
  • 好域名做網(wǎng)站微信視頻號(hào)怎么推廣引流
  • 先做它個(gè)天貓網(wǎng)站百度搜索關(guān)鍵詞
  • 做網(wǎng)站的流程分析-圖靈吧百度指數(shù)查詢app
  • wordpress blod關(guān)鍵詞是網(wǎng)站seo的核心工作
  • 旅游網(wǎng)站建設(shè)的目的及功能定位優(yōu)幫云首頁(yè)推薦
  • 博客網(wǎng)站的建設(shè)手機(jī)百度網(wǎng)盤下載慢怎么解決
  • 自己做網(wǎng)站可以隨便起名字嗎友情鏈接站長(zhǎng)平臺(tái)
  • 什么行業(yè)做網(wǎng)站百度指數(shù)數(shù)據(jù)
  • 建設(shè)銀行官方網(wǎng)站地址新品牌推廣策略
  • 橋頭鎮(zhèn)網(wǎng)站仿做電商網(wǎng)頁(yè)
  • 大城網(wǎng)站制作新手怎么做網(wǎng)頁(yè)
  • 微信推送怎么做購(gòu)物網(wǎng)站360搜索引擎網(wǎng)址
  • 成都捕魚網(wǎng)站建設(shè)昆明seo培訓(xùn)
  • 服務(wù)器網(wǎng)站綁定域名網(wǎng)站建設(shè)最新中央人事任免
  • 個(gè)人做網(wǎng)站賺錢太原做網(wǎng)站的
  • 網(wǎng)站域名查企業(yè)郵箱黃頁(yè)
  • 創(chuàng)建網(wǎng)站主題在哪里近期重大新聞
  • 電視直播網(wǎng)站開(kāi)發(fā)神童預(yù)言新冠2023結(jié)束
  • 做場(chǎng)景秀的網(wǎng)站長(zhǎng)尾關(guān)鍵詞舉例
  • 學(xué)做網(wǎng)站必須php嗎seo jsbapp9
  • 做國(guó)外網(wǎng)站關(guān)鍵詞用寫營(yíng)銷推廣內(nèi)容
  • 不用fash做的視頻網(wǎng)站個(gè)人怎么做網(wǎng)站
  • 網(wǎng)站開(kāi)發(fā)投標(biāo)書范本目錄阿里云域名注冊(cè)查詢
  • vb實(shí)現(xiàn)asp網(wǎng)站開(kāi)發(fā)百度圖像搜索
  • 建站寶盒做的網(wǎng)站遼源seo
  • 自學(xué)做網(wǎng)站要多久成都公司網(wǎng)站seo
  • 自己做網(wǎng)站哪里最好網(wǎng)絡(luò)推廣方法有幾種
  • 單位的網(wǎng)站怎樣設(shè)計(jì)才美觀鹽城seo營(yíng)銷