1. 程式人生 > >Android開發中Java回撥機制的應用

Android開發中Java回撥機制的應用

  用Java寫了這麼久的程式,一直沒有理解什麼是回撥,在最近的Android開發工作中,一個偶然的需求讓我突然就對Java中的回撥有了一個理解,遂記錄之。

  首先這個需求是這樣的,一個Activity中的有一個View,我需要在不同的觸發條件下更換這個View的Layout,我們很容易想到寫一個方法,把要更換成的Layout的id傳進去,然後為這個View設定一下content。就可以在不同的條件下呼叫這個函式來設定View的layout了,這不難理解。

  但是,假設,現在該View的Layout更換成了LayoutA,LayoutA裡面有一個ImageView,我要對該ImageView通過程式碼設定一些屬性;然後,另一時刻,該View的Layout換成了LayoutB,LayoutB裡面有一個Button,我要對該Button通過程式碼做一些設定,怎麼辦?

  我們可以這樣解決:

class MyActivity extends Activity {
	View view;
	int currentContentFlag;

	private static final int ViewA = 1; // 標誌著當前View顯示的內容是ViewA
	private static final int ViewB = 2; // 標誌著當前View顯示的內容是ViewB

	/**
	* 3.最後看這個函式
	*/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 一些例如對view初始化工作略去

		// 我們在這裡設定View的layout的Id為layoutId_A
		currentContentFlag = ViewA; // 修改當前顯示內容的flag,告訴這個setViewContent函式裡面到底執行setViewA還是setViewB
		setViewContent(R.layout.layoutId_A);
	}

	/**
	* 1.先看本函式
	*/
	private void setViewContent(int layoutId) {
		view = LayoutInflater.from(this).inflate(layoutId, null); // 設定View的內容
		switch (currentContentFlag) {
			case ViewA:
				// 說明當前View的內容是ViewA,在這裡用程式碼對ViewA裡面的東西進行具體設定
				setViewA(view);
				break;
			case ViewB:
				// 說明當前View的內容是ViewB,在這裡用程式碼對ViewB裡面的東西進行具體設定
				setViewB(view);
				break;
			default :
				break;
		}
	}

	/**
	* 2.再看這兩個函式
	*/
	private setViewA(View view) {

	}

	private setViewB(View view) {

	}
}

  這樣的話,每設定一次View的內容,都要修改當前顯示內容的flag,通過維護這個flag變數,來告訴這個setViewContent函式裡面到底執行setViewA還是setViewB。

  這樣做可不可行呢?實現肯定也可以實現,但是,我想到了用回撥機制來完成這件事。

  什麼是回撥呢?回調回調,回去呼叫。我理解回撥,就是,在程式碼執行的過程中,函式FunA()某一時刻被呼叫,那麼將轉去執行FunA(),在FunA執行的時候呢,又反過來去執行原始碼裡的一些東西。這應該是最淺顯的解釋了吧。

  在Java語言裡面,我們可以通過interface實現自己的回撥,Java裡面的interface真的太有用了。則上面的程式碼可以改為下面的實現:

class MyActivity extends Activity {
	View view;

	/**
	* 3.看這個函式
	*/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 一些例如對view初始化工作略去

		// 我們在這裡設定View的layout的Id為layoutId_A
		currentContentFlag = ViewA; 
		setViewContent(R.layout.layoutId_A, new ConfigViewInterface() { // 傳進去一個介面,並覆蓋裡面的方法
			public void setView(View view) {
				setViewA(view);
			}
		});
	}

	/**
	* 2.看本函式
	*/
	private void setViewContent(int layoutId, ConfigViewInterface configViewInterface) {
		view = LayoutInflater.from(this).inflate(layoutId, null); // 設定View的內容
		configViewInterface.setView(view);
	}

	/**
	* 4.看這兩個函式
	*/
	private setViewA(View view) {

	}

	private setViewB(View view) {

	}

	/**
	* 1.看本介面
	*/
	private interface ConfigViewInterface {
		void setView(View view) ;
	}
}

  這樣是不是就好多了呢?慢慢理解下上面的程式碼,多少會對你有幫助的。有時候學知識,就要所練,可能當時不理解某個點,不知什麼時候突然就懂了。

  歡迎拍磚。

相關推薦

Android開發Java機制應用

  用Java寫了這麼久的程式,一直沒有理解什麼是回撥,在最近的Android開發工作中,一個偶然的需求讓我突然就對Java中的回撥有了一個理解,遂記錄之。   首先這個需求是這樣的,一個Activity中的有一個View,我需要在不同的觸發條件下更換這個View的Lay

Java機制Android應用

一、前言 1.回撥定義 就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法 2.經典的回撥方式: ● Class A實現介面CallBack callback——背景1 ● class A中包含一個

對於Android介面機制的理解

對於介面回撥機制首先要弄明白的問題是為什麼需要它,也就是介面回撥能為我們解決什麼問題: 在開發過程中我們經常會遇到一些有關觸發執行的問題,比如使用者觸發按鈕,然後程式就執行了一系列的操作的比如註冊登入啊;問題的核心在於為什麼是出發了按鈕才執行,不觸發就不執行嗎? 這個時候就能體現出各

由淺入深理解Android機制

什麼是介面回撥?來先看看介面回撥的定義吧:可以把使用某一介面的類建立的物件的引用賦給該介面宣告的介面變數,那麼該介面變數就可以呼叫被類實現的介面的方法。什麼意思?反正我是沒看懂,哈哈(#黑線),這麼官方的話還是不要看的好,不如看一個具體的例子。 話說有一天,奧

Java機制(以Android事件監聽器為例)

Java的設計模式中有回撥這個機制,在Android開發中我們也會經常用到回撥機制。下面就通過一些小例子來說明什麼是回撥。 假如我們要實現這個這樣一個功能。 MainActivity中由一個Fragment和一個ViewPager構成,Fragment中有一系列按鈕,通過

深入理解Java機制(最通俗易懂的機制的部落格)

1. 什麼是回撥? 在我看來,回撥其實是一個相當具有迷惑性的名字,因為它很容易讓人糾結於回撥這個詞語本身的含義,從而忽略了回撥這種機制的本質。要理解Java中的回撥概念,最好的方式不是通過例項,而是從回撥概念的起源說起。   最開始接觸回撥時在C語言中函式指

夯實Java基礎系列11:深入理解Java機制

目錄 模組間的呼叫 多執行緒中的“回撥” Java回撥機制實戰 例項一 : 同步呼叫 例項二:由淺入深 例項三:Tom做題 參考文章

Android開發java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}

net 控件 view etc spi pos rst ack data Android開發中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullP

java機制詳解

原文出自這兒:https://blog.csdn.net/fengye454545/article/details/80198446   為了自己能夠加深理解自己動手敲了一遍,也寫寫,有時間看看。更詳細建議訪問原創博主。 ===========================

java機制用的理解與例項

生活場景如下: Wang寫數學題,有一道比較難,需要問Li,Li也不會,要先回家一趟問問老爸怎麼做,這個時候有wang如下三種選擇: 1)一直等待Li回來,期間啥也不幹同步方式 2) 等等再過來看Li回來沒,非同步future方式 3)wang把電話留下來,讓LI回來時打電話給自

一個經典例子讓你徹徹底底理解java機制

                以前不理解什麼叫回調,天天聽人家說加一個回撥方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回撥:就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法,這樣子說你是不是有點暈暈的,

深入淺出: Java機制(非同步)

Writer      :李強強 什麼是回撥?今天傻傻地截了張圖問了下,然後被陳大牛回答道“就一個回撥…”。此時千萬個草泥馬飛奔而過(逃 哈哈,看著原始碼,享受著這種回撥在程式碼上的作用,真是美哉。不妨總結總結。 一、什麼是回撥 回撥,回撥。要先有呼叫,才有呼叫者和被呼叫者之間的回撥。所以在百

[Java]機制

現有A、B兩個類,兩個類的例項a、b,A中實現a()方法,B中實現b()方法。 回撥要求物件a在呼叫b物件的b()方法時,b()方法返回前需呼叫物件a的a()方法。 以管道通訊傳輸為例,程式需要一邊不停接收對端傳來的資料並將接收到的資料進行處理,而又不影響主執行緒的進行。  

Java機制的學習(CallBack)

深入淺出的理解Java回撥機制(一個有趣的小例子): http://www.cnblogs.com/heshuchao/p/5376298.html Java同步呼叫,非同步呼叫,回撥(參考) https://www.cnblogs.com/xrq730/p/6424471.html

Android開發java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi

今天學習Android開發突然遇到了這個問題,查閱了很多資料,並且對集中原因進行了分析。  錯誤資訊字串:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.first/com.f

Java基礎9——深入理解java機制

Java回撥機制 回撥的引入故事 轉載自Bro_超 // 同步回撥 1 public interface doJob 2 { 3 public void fillBlank(int a, int b, int result); 4 } 1 public class Su

Java機制(非同步)

什麼是回撥?今天傻傻地截了張圖問了下,然後被陳大牛回答道“就一個回撥…”。此時千萬個草泥馬飛奔而過(逃 哈哈,看著原始碼,享受著這種回撥在程式碼上的作用,真是美哉。不妨總結總結。 一

java機制經典例子

以前不理解什麼叫回調,天天聽人家說加一個回撥方法啥的,心裡想我草,什麼叫回調方法啊?然後自己就在網上找啊找啊找,找了很多也不是很明白,現在知道了,所謂回撥:就是A類中呼叫B類中的某個方法C,然後B類中反過來呼叫A類中的方法D,D這個方法就叫回調方法,這樣子說你是不

淺談Java機制

回撥機制讓我們程式碼執行更加高效,也讓我們程式碼變得非常的簡潔明瞭! 首先我們用個案例來一步一步帶入,當我們需要解析一段JSON字串時大部分我們的操作就是: public class ParseJS

Java機制解析

模組之間總是存在這一定的介面,從呼叫方式上看,可以分為三類:同步呼叫、回撥和非同步呼叫。同步呼叫是一種阻塞式呼叫,也是我們在寫程式中經常使用的;回撥是一種雙向的呼叫模式,也就是說,被呼叫的介面被呼叫時也會呼叫對方的介面,這句話可能有點繞,等文章後面舉例說明;非同步呼叫是一種類似訊息或事件的機制,解決了同步