Java回撥機制(以Android事件監聽器為例)
Java的設計模式中有回撥這個機制,在Android開發中我們也會經常用到回撥機制。下面就通過一些小例子來說明什麼是回撥。
假如我們要實現這個這樣一個功能。
MainActivity中由一個Fragment和一個ViewPager構成,Fragment中有一系列按鈕,通過按下這些按鈕可以來切換ViewPager的當前頁卡,一般我們會這麼實現。
首先在Fragment中獲得MainActivity。
private MainActivity activity;//Frgament的成員變數 @Override public void onStart() {//Fragment的onStart方法 super.onStart(); activity = (MainActivity) getActivity(); }
然後再Fragment中的button的點選事件中,獲取activity中的ViewPager例項,然後執行setcurrentItem()方法。
mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.mViewPager.setCurrentItem(2);
}
});
這樣做我們就實現了功能。
接下來,同樣的功能,我們如果使用回撥機制的話。是這樣實現的。
首先寫一個介面。
public interface OnToolBarSelectListener { public void onSelect(int postion); }
看名字就知道了,在按鈕按下的時候的監聽器。
然後在MainActivity中實現這個介面。
public class MainActivity extends Activity implements OnToolBarSelectListener { private Context mContext; private ViewPager mViewPager; private ToolBarFragment toolBarFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; } @Override public void onSelect(int position) { mViewPager.setCurrentItem(position); } }
同時在Fragment中,我們要獲取MainActivity。同時在控制元件的點選事件中執行介面中的方法。
public class ToolBarFragment extends BaseFragment implements OnViewPagerSlideListener {
private MainActivity activity;
private OnToolBarSelectListener mOnToolBarSelectListener;
public void setOnToolBarSelectListener(OnToolBarSelectListener mOnToolBarSelectListener) {
this.mOnToolBarSelectListener = mOnToolBarSelectListener;
}
@Override
public void onStart() {
super.onStart();
this.setOnToolBarSelectListener((MainActivity) getActivity());
mViewHolder.item1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnToolBarSelectListener.onSelect(1);
}
});
}
}
首先MainActivity實現了介面,然後在onSelect方法中做好點選之後要做的事情。
然後在Fragment中,獲得這個介面的例項,並在相應的地方處理(點選事件監聽中)。
在本例中,其實OnToolBarSelectListener是沒有必要寫set方法的,因為直接就在Frgament中處理了,但是如果需要換別的地方處理,一個set方法可以讓你的程式更有條理。
後面的解決方案在當前需求的情況下,的確有些畫蛇添足了。
但是這樣的做法的確是遵循了JAVA的設計模式,在需求情況比較複雜的情況下這麼寫,程式碼的維護性會很高。
參考:http://blog.csdn.net/xiaanming/article/details/8703708/
http://blog.csdn.net/pi9nc/article/details/23169357