<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                轉載請標明原地址:[http://blog.csdn.net/gaolei1201/article/details/47084111](http://blog.csdn.net/gaolei1201/article/details/47084111) 前言:本人也算是自學“成才”,呵呵,大學時雖然學的計算機,但是對軟件開發卻并不感興趣。畢業后看同學們或培訓Android或培訓IOS 4個月后都很快找到了不錯的工作,令我感到很詫異,也很羨慕!于是我做出了人生中重要的一個決定,開始學習Android,由于本人比較窮,所以選擇自學。學習的過程實為不易,從剛開始的一無所知時的苦苦掙扎,到學有所得后的應對有策,全靠自己的勤學好問。由于自己以前也困于抽象、接口等“嚇人”的東西,網上又缺乏在項目中實戰運用的講解,下面我就斗膽把自己的理解和大家交流一下下。 學Java的人應該都知道面向對象的三大特征:封裝、繼承、多態,幾乎全部涉及到了接口和抽象,還有JAVA設計模式六大原則也幾乎全部涉及到了接口和抽象,由此可以看出抽象的重要性。抽象這個詞聽起來很抽象,學起來也很抽象,而接口是特殊的抽象類(類里面的方法全部是抽象方法),那就更抽象了。我一直知道抽象的存在,但是一直不知道怎么用它和它有什么好處,也不知道該如何問別人。于是就這么寫著代碼做著項目,直到有一次。有人要問了,不會運用抽象、接口之類的東西不是也能寫項目嗎?我要說的是代碼的質量不同,要不然磚家們為什么要發明它呀?! 在做項目的過程中,有一次和做服務器的同事討論點問題,他看了一下我的代碼,然后發現了比較嚴重的問題,那是請求網絡操作。我引用的是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](http://download.csdn.net/detail/gaolei1201/8936209) 接口回調的條件就是一個接口,兩個類,兩個類之間互相操作。無論是哪兩個類,如Service和Activity,Fragment和Fragment,Fragment和Activity等等。它符合JAVA設計模式六大原則之依賴倒置原則。?關于設計模式的六大原則可參考我的上篇博客:[http://blog.csdn.net/gaolei1201/article/details/47082783](http://blog.csdn.net/gaolei1201/article/details/47082783)?。關于接口回調的詳細內容可以參考:[http://www.2cto.com/kf/201412/365788.html](http://www.2cto.com/kf/201412/365788.html)?和?http://blog.csdn.net/lindir/article/details/7819720 下面再講一個例子說明,Fragment是項目中常用的組件,但是他們之間交互你是怎么實現的呢?不得其領的人應該做起來是比較困難的,像以前的我。如FragmentA想要改變FragmentB的UI,你首先可能會想到在FragmentB中寫一個方法如changeFragmentUI()來改變FragmentB的UI,1、你首先想到的是new FragmentB().changeFragmentUI(),但是你試過后發現是不行的報:NullPointerException。這是因為你有重新new了一個FragmentB,而需要改變的組件初始化是在原來的FragmentB。2、把changeFragmentUI設為static,那就可以FragmentB.chaneFragmentUI()。這樣雖然不會報空指針異常,但是static方法里面的變量也就必須全部是static,也就是你要改變UI的組件都要聲明是static,想想,如果有太多的static那樣肯定是不好的。這時如果會用接口回調那么就能解決你所有的煩惱啦,下面舉例實現兩個Fragment之間交互來改變彼此UI的例子。當然你也可以用官方提供的Fragment之間通信的方法:[http://blog.csdn.net/gaolei1201/article/details/47045461](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,和原來初始化的那個不是 一個,會報空指針,因為RightFragment的listener沒有被set(實例化)。所以應該這樣 ?RightFragment.setOnFragmentChangeListener(this);*/ RightFragment.setOnFragmentChangeListener(this); change_activity_bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //在這里執行接口方法 onFragmentChangeListener.onFragmentChange(); } }); return view; } @Override public 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,和原來初始化的那個不是 ? ?一個,會報空指針,因為LeftFragment的listener沒有被set(實例化)。所以應該這樣 ?LeftFragment.setOnFragmentChangeListener(this);*/ LeftFragment.setOnFragmentChangeListener(this); change_activity_bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //在這里執行接口方法 onFragmentChangeListener.onFragmentChange(); } }); return view; } @Override public void onFragmentChange() { // 在子類中實現接口的方法 show_change_text.setText("I am RightFragment,and I have changed"); } ~~~ 這是Demo下載地址:[http://download.csdn.net/detail/gaolei1201/8936215](http://download.csdn.net/detail/gaolei1201/8936215) **這不是對大牛說的。抽象、接口確實比較抽象這需要自己不斷學習、總結,更重要的是在項目中去運用它,之后,你就會理解它的作用,發現它的優點,一回生二回熟三回你就成師傅了,Come on baby!Oh yeah!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看