Java與Android使用監(jiān)聽者模式示例
正文
監(jiān)聽者模式(觀察者模式)能降低對象之間耦合程度。為兩個相互依賴調用的類進行解耦。
便于進行模塊化開發(fā)工作。不同模塊的開發(fā)者可以專注于自身的代碼。
監(jiān)聽者用來監(jiān)聽自已感興趣的事件,當收到自已感興趣的事件時執(zhí)行自定義的操作。
在某些數據變化時,其他的類做出一些響應。處理數據(或者分發(fā)事件)的類主動投送消息,感興趣的類主動“訂閱”消息。
監(jiān)聽者模式在Android中有大量的運用,相信大家都不會感到陌生。在Android開發(fā)中,Button控件的點擊事件就是監(jiān)聽者模式最常見的例子。
當Button被點擊,執(zhí)行了 OnClickListener.onClick。 Activity中給這個Button設置了自己實現的OnClickListener,并復寫了onClick方法,就能執(zhí)行自定義操作了。
Java代碼實例
下面來用Java來實現監(jiān)聽者模式。
這個例子是給“計算類”持續(xù)地傳入數據,處理好數據后,發(fā)出結果。感興趣的類接收結果。
2個文件:AlgoCalculator.java;MainUser.java
AlgoCalculator.java是計算部分,接收數據并進行計算。并將結果傳遞出去。MainUser.java是調用方,將基本數據傳入AlgoCalculator并監(jiān)聽結果。
package com.algo;
import java.util.LinkedList;
import java.util.List;
public class AlgoCalculator {
private List<short[]> mDataBuffer = new LinkedList<>();
public AlgoCalculator() {
}
// 定義一個Listener接口;可將一個boolean值傳遞出去
public interface ResultChangeListener {
void onChange(boolean found);
}
private ResultChangeListener resultChangeListener;
// 調用方能夠設置并實現這個接口
public void setResultChangedListener(ResultChangeListener resultChangedListener) {
this.resultChangeListener = resultChangedListener;
}
// 傳輸數據
public void setDataStream(short[] data) {
checkData(data);// 處理數據方法
}
// 處理數據,并送出結果
private void checkData(short[] data) {
if (data.length == 0) {
return;
}
long sum = 0;
for (short b : data) {
sum += b;
}
if (sum > 40) {
resultChangeListener.onChange(true); // 數據處理結果
} else {
resultChangeListener.onChange(false);
}
}
}
主程序;調用方傳入數據,獲取結果
import com.algo.AlgoCalculator;
public class MainUser {
public static void main(String[] args) {
AlgoCalculator algoCalculator = new AlgoCalculator(); // 初始化
// 設置監(jiān)聽器,并在里面增加要執(zhí)行的動作
algoCalculator.setResultChangedListener(new AlgoCalculator.ResultChangeListener() {
@Override
public void onChange(boolean found) {
System.out.println("result: " + found);
}
});
short[] data1 = {1, 2, 3,};
short[] data2 = {10, 20, 30};
short[] data3 = {6, 7, 8};
short[] data4 = {1, 1, 1};
// 傳入數據
algoCalculator.setDataStream(data1); // output false
algoCalculator.setDataStream(data2); // output true
algoCalculator.setDataStream(data3); // output false
algoCalculator.setDataStream(data4); // output false
}
}
在另外的類里,能夠很方便地調用AlgoCalculator的計算能力并獲取計算結果。 在這里,每傳入一次數據,就能獲取一個結果。如果每秒鐘傳入一次數據,每秒鐘就能獲取一個結果。 我們可以把復雜的算法封裝起來,客戶端只需要傳入數據,即可獲得(監(jiān)聽到)結果。
很多場景中都使用了監(jiān)聽者模式。開發(fā)者也可能在不知不覺中就運用了這個模式。
Android中使用監(jiān)聽器
最常見的例子是給Button設置點擊事件監(jiān)聽器。 類似上個例子,設計一個接口當做監(jiān)聽器。Android中回調時可以利用handler,控制調用的線程。
private Handler mMainHandler;
mMainHandler = new Handler(Looper.getMainLooper());// 在主線程中運行
private void notifySthChange(final int state) {
mMainHandler.post(new Runnable() {
@Override
public void run() {
ArrayList<SListener> list = new ArrayList<>(mListeners);
for (SListener l : list) {
l.OnSthChanged(state);
}
}
});
}
在回調中可以直接更新UI。
以上就是Java與Android使用監(jiān)聽者模式示例的詳細內容,更多關于Java Android監(jiān)聽者模式的資料請關注腳本之家其它相關文章!
相關文章
spring boot實現上傳圖片并在頁面上顯示及遇到的問題小結
最近在使用spring boot搭建網站的過程之中遇到了有點小問題,最終解決方案是在main目錄下新建了一個webapp文件夾,并且對其路徑進行了配置,本文重點給大家介紹spring boot實現上傳圖片并在頁面上顯示功能,需要的朋友參考下吧2017-12-12
Java使用PrepareStatement實現數據的插入與查詢操作
這篇文章主要為大家詳細介紹了Java如何使用PrepareStatement實現數據的插入與查詢操作,文中的示例代碼講解詳細,感興趣的可以了解一下2022-09-09
IDEA遠程連接HBase及其Java API實戰(zhàn)詳解
這篇文章主要介紹了IDEA遠程連接HBase及其Java API實戰(zhàn)詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
SpringSecurity從數據庫中獲取用戶信息進行驗證的案例詳解
這篇文章主要介紹了SpringSecurity從數據庫中獲取用戶信息進行驗證的案例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Springboot @WebFilter無法注入其他Bean的示例問題
這篇文章主要介紹了Springboot @WebFilter無法注入其他Bean的示例問題,本文通過示例代碼給大家分享解決方法,需要的朋友可以參考下2021-09-09
SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實現代碼
這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實現,文中通過代碼示例和圖文結合的方式給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-08-08

