Android實戰之 萬能的介面回調

來源:互聯網
上載者:User

標籤:map   ttext   機制   error   決定   contain   poi   畢業   重要   

      

       轉載請標明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111


       前言:本人也算是自學“成才”,呵呵,大學時儘管學的電腦,可是對軟體開發卻並不感興趣。

畢業後看同學們或培訓Android或培訓IOS 4個月後都非常快找到了不錯的工作。令我感到非常詫異,也非常羨慕!於是我做出了人生中重要的一個決定。開始學習Android。因為本人比較窮,所以選擇自學。

學習的過程實為不易,從剛開始的一無所知時的苦苦掙紮,到學有所得後的應對有策,全靠自己的勤學好問。

因為自己曾經也困於抽象、介面等“嚇人”的東西,網上又缺乏在項目中實戰運用的解說,以下我就鬥膽把自己的理解和大家交流一下下。


       學Java的人應該都知道物件導向的三大特徵:封裝、繼承、多態。差點兒所有涉及到了介面和抽象。還有JAVA設計模式六大原則也差點兒所有涉及到了介面和抽象。由此能夠看出抽象的重要性。抽象這個詞聽起來非常抽象,學起來也非常抽象,而介面是特殊的抽象類別(類裡面的方法所有是抽象方法)。那就更抽象了。

我一直知道抽象的存在,可是一直不知道怎麼用它和它有什麼優點。也不知道該怎樣問別人。

於是就這麼寫著代碼做著項目,直到有一次。

有人要問了,不會運用抽象、介面之類的東西不是也能寫項目嗎?我要說的是代碼的品質不同,要不然磚家們為什麼要發明它呀?!


      在做項目的過程中,有一次和做server的同事討論點問題。他看了一下My Code,然後發現了比較嚴重的問題,那是請求網路操作。我引用的是AsyncHttpClient.jar,每次網路請求都:

RequestParams params = new RequestParams();new AsyncHttpClient( ).post(requestUrl, params,new AsyncHttpResponseHandler() {public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {}public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {}}

所以在一個Activity活Fragment中都要new AsyncHttpClient(),好多次。這樣也會產生很多反覆代碼,以及條理不清,不符合單一職責原則。於是他幫我把網路請求操作單獨出來一個類,這樣它就行被重用。再通過介面回調和Fragment或Activity互動。我感覺這樣很棒,自己對介面的理解也豁然開朗:

 public  class NetRequest  {private NetRequestIterface netRequestIterface;private Context context;public NetRequest( NetRequestIterface netRequestIterface,Context context) {this.netRequestIterface= netRequestIterface;this.context=context;}        RequestParams params = new RequestParams();if (null!=map&&!map.isEmpty())for (String key : map.keySet()) {params.put(key, map.get(key));}      new AsyncHttpClient( ).post(requestUrl, params,new AsyncHttpResponseHandler() {     public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {     //這裡是把網路非同步解析出來的result傳遞到子類,requestUrl是一個標誌推斷是哪一個請求。子類實現changeView()      netRequestIterface.changeView(result, requestUrl);   }    public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {}   } } 

這是我寫的一個網路操作介面回調的一個小Demo,代碼:

http://download.csdn.net/detail/gaolei1201/8936209


        介面回調的條件就是一個介面。兩個類,兩個類之間互相操作。不管是哪兩個類,如Service和Activity,Fragment和Fragment。Fragment和Activity等等。它符合JAVA設計模式六大原則之依賴倒置原則。

 關於設計模式的六大原則可參考我的上篇部落格:http://blog.csdn.net/gaolei1201/article/details/47082783 。

     

       以下再講一個範例說明。Fragment是項目中經常使用的組件,可是他們之間互動你是怎麼實現的呢?不得其領的人應該做起來是比較困難的。像曾經的我。如FragmentA想要改變FragmentB的UI,你首先可能會想到在FragmentB中寫一個方法如changeFragmentUI()來改變FragmentB的UI,1、你首先想到的是new FragmentB().changeFragmentUI(),可是你試過後發現是不行的報:NullPointerException。這是由於你有又一次new了一個FragmentB。而須要改變的組件初始化是在原來的FragmentB。

2、把changeFragmentUI設為static,那就能夠FragmentB.chaneFragmentUI()。

這樣儘管不會報null 指標異常,可是static方法裡面的變數也就必須所有是static。也就是你要改變UI的組件都要聲明是static。想想。假設有太多的static那樣肯定是不好的。

這時假設會用介面回調那麼就能解決你所有的煩惱啦,以下舉例實現兩個Fragment之間互動來改變彼此UI的範例。

當然你也能夠用官方提供的Fragment之間通訊的方法:http://blog.csdn.net/gaolei1201/article/details/47045461

例如以下LeftFragment代碼:

public class LeftFragment extends Fragment implements OnFragmentChangeListener {private TextView show_change_text;private Button change_activity_bt;public static OnFragmentChangeListener onFragmentChangeListener;public static void setOnFragmentChangeListener(OnFragmentChangeListener onFragmentChangeListener){RightFragment.onFragmentChangeListener=onFragmentChangeListener;}public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);View view = inflater.inflate(R.layout.right_fragment, null);change_activity_bt = (Button) view.findViewById(R.id.change_activity_bt);show_change_text = (TextView) view.findViewById(R.id.show_change_text);/* new RightFragment().setOnFragmentChangeListener(this); 這樣set是不行的,由於這樣又又一次創造了一個RightFragment,和原來初始化的那個不是 一個,會報null 指標,由於RightFragment的listener沒有被set(執行個體化)。所以應該這樣  RightFragment.setOnFragmentChangeListener(this);*/RightFragment.setOnFragmentChangeListener(this);change_activity_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//在這裡運行介面方法onFragmentChangeListener.onFragmentChange();}});return view;}@Overridepublic void onFragmentChange() {// 在子類中實現介面的方法show_change_text.setText("I am LeftFragment,and I have changed");}}例如以下是RightFragment代碼,和LeftFrgment差點兒一樣,由於它們的邏輯一樣:public class RightFragment extends Fragment implements OnFragmentChangeListener {private TextView show_change_text;private Button change_activity_bt;public static OnFragmentChangeListener onFragmentChangeListener;public static void setOnFragmentChangeListener(OnFragmentChangeListener onFragmentChangeListener){RightFragment.onFragmentChangeListener=onFragmentChangeListener;}public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);View view = inflater.inflate(R.layout.right_fragment, null);change_activity_bt = (Button) view.findViewById(R.id.change_activity_bt);show_change_text = (TextView) view.findViewById(R.id.show_change_text);/* new LeftFragment().setOnFragmentChangeListener(this); 這樣set是不行的。由於這樣又又一次創造了一個LeftFragment,和原來初始化的那個不是    一個。會報null 指標。由於LeftFragment的listener沒有被set(執行個體化)。所以應該這樣  LeftFragment.setOnFragmentChangeListener(this);*/LeftFragment.setOnFragmentChangeListener(this);change_activity_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//在這裡運行介面方法onFragmentChangeListener.onFragmentChange();}});return view;}@Overridepublic void onFragmentChange() {// 在子類中實現介面的方法show_change_text.setText("I am RightFragment,and I have changed");}

 關於介面回調的一些具體資料能夠參考:

1、弄明確Android 介面回調機制:http://www.2cto.com/kf/201412/365788.html 

2、android中的回調: http://blog.csdn.net/lindir/article/details/7819720

3、 一個經典範例讓你徹徹底底理解java回調機制:http://blog.csdn.net/xiaanming/article/details/8703708/


這不是對大牛說的。抽象、介面確實比較抽象這須要自己不斷學習、總結,更重要的是在項目中去運用它。之後,你就會理解它的作用,發現它的長處,一回生二回熟三回你就成師傅了,Come on baby!Oh yeah!


這是Demo:http://download.csdn.net/detail/gaolei1201/8936215






Android實戰之 萬能的介面回調

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.