1. <div id="f8mbs"></div>
        您好,歡迎來到源碼搜藏網!分享精神,快樂你我!
        [加入VIP] 設為首頁 | 收藏本站 | 網站地圖 | Sitemap | TAG標簽
      2. 首 頁
      3. 在線工具
      4. jquery手冊
      5. 當前位置:首頁 > 安卓源碼 > 技術博客 >

        一個使用MVP模式的簡單圖像獲取應用程序實現

        時間:2018-08-08 23:29 來源:互聯網 作者:源碼搜藏 瀏覽:收藏 挑錯 推薦 打印

        介紹 ImgurDner 是一款實驗性的Android應用程序,可從 imgur.com 下載熱門圖像 。 它采用流行的MVP或Model View&Presenter模式構建。 背景 雖然使用設計模式不是開發移動應用程序的先決條件,但是諸如MVC或MVP之類的架構模式有助于實現代碼關注點的分離:將

        一個使用MVP模式的簡單圖像獲取應用程序實現

        介紹

        ImgurDner是一款實驗性的Android應用程序,可從imgur.com下載熱門圖像它采用流行的MVP或Model View&Presenter模式構建。

        背景

        雖然使用設計模式不是開發移動應用程序的先決條件,但是諸如MVC或MVP之類的架構模式有助于實現代碼關注點的分離:將負責視圖的模塊與用于業務邏輯的模塊區分開來; 在GUI和后端數據之間建立有效的通信通道。此外,單元測試變得更容易,代碼的可讀性和維護性也得到顯著增強。

        使用代碼

        為了進行點對點演示,作者保持代碼簡單,以便讀者可以專注于代碼的架構方面,以掌握對Android編程中MVP模式的使用的理解。

        在MVP模式中,Presenter充當視圖和模型之間的“中間人”。它與View模塊建立雙向通信:根據Model請求從View獲取輸入; 同時,從模型中檢索結果并通過View的方法直接更新GUI(這是MVC模式中MVP的一個顯著特征)。

        該項目包含五個主要的java文件:

        • DownloadActivityDownloadFragment,這兩個文件是View模塊(雖然它主要是Fragment的工作.Android建議使用片段覆蓋活動來實現UI目的);
        • DownloadContract,一個托管View子接口和Presenter接口的接口;
        • DownloadPresenter,演示者界面的實現,充當View和Model之間的聯絡人
        • ImgurService,一個符合Retrofit HTTP客戶端框架協議的Inteface類,用于輕松和異步Web服務訪問。

        DownloadActivity.java負責創建Presenter的實例并將引用傳遞給片段組件; activity類還負責將片段(View實現)傳遞給Presenter。通過完成這兩個步驟,視圖和演示者現在可以進行雙向通信。需要注意的是,MVP和MVC模式之間的一個區別在于,MVP演示者可以通過視圖引用來操縱UI呈現。

        @Override
            protected void onCreate(Bundle savedInstanceState) {
        		...
                //retrieve the reference to the fragment
                DownloadFragment downloadFragment = (DownloadFragment)getSupportFragmentManager().findFragmentById(R.id.contentFrame);
                if(downloadFragment == null){
                    downloadFragment = DownloadFragment.newInstance();
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.add(R.id.contentFrame, downloadFragment);
                    transaction.commit();
                }
                //crate a presenter
                downloadPresenter = new DownloadPresenter(downloadFragment); //pass the view reference to the presenter
                downloadFragment.setPresenter(downloadPresenter); //pass the presenter reference to the view
            }
        ...

        在MVP模式中使用Contract接口是一種常見做法,它由兩個子接口組成。

        • 查看界面普通的Android Fragment類將實現此接口。
        • Presenter界面,包括基本演示者的功能。任何具體的Presenter類至少會實現此接口。
        public interface DownloadContract {
            interface View extends BaseView<presenter> {
            }
        
            interface Presenter extends BasePresenter {
            }
        }
        
        public interface BasePresenter {
            void start();
        }
        
        public interface BaseView<T> {
            void setPresenter(T presenter);
        }</presenter>

        具體的Presenter類可以很好地從Web服務中獲取數據。在這種情況下,我們使用imgur.com的API來訪問其豐富的圖像存儲庫。

        為了訪問imgur的webservice,我們使用Retrofit HTTP客戶端框架簡要步驟如下所示:
        首先,我們使用Web服務的URL定義接口

        public interface ImgurService {
        
            String URL = "https://api.imgur.com/3/gallery/hot/viral/0.json";
        
            @Headers({
                    "Authorization: Client-ID XXXXXXXXX",
                    "User-Agent: XXXXXXXXXXXXXXXXXXXXXXXXX"
            })
            @GET("/")
            void getAllImages(Callback<Image> cb);
        }

        然后我們按照Retrofit的編碼約定檢索數據,一旦成功,演示者調用View的方法來更新UI:

        ImgurService restInterface =  new RestAdapter.Builder().setEndpoint(ImgurService.URL).build().create(ImgurService.class);
                    restInterface.getAllImages(new retrofit.Callback<Image>() {
                        @Override
                        public void success(Image model, retrofit.client.Response response) {
                            List<Datum> images = model.getData();
                            for(Datum img : images){
                                Log.d(TAG, img.getLink());
                            }
                            List<Datum> jpgImgs = Stream.of(images).filter(p -> p.getLink().contains(".jpg")||p.getLink().contains(".gif")).collect(Collectors.toList());
                            ImageRepo.newInstance().setImages(jpgImgs);
                            ((DownloadFragment)mDownloadView).updateUI();
                            ((DownloadFragment)mDownloadView).stopSpin();
                        }
        
                        @Override
                        public void failure(RetrofitError error) {
                            Log.e(TAG, error.getMessage());
                        }
                    });

        需要注意的是DatumImage等類是從JSON流(imgur的Web服務使用的數據格式)轉換而來的Java類。處理java對象比為開發人員解析原始JSON流要舒服。這種JSON < - > Java對象轉換稱為編組/解組,可以通過Jackson等技術實現

        等一下,這里我有一個更好的主意,請按照以下兩個簡單的步驟:

        • 使用HTTP客戶端實用程序,我最喜歡的是postman來獲取JSON中的數據

          一個使用MVP模式的簡單圖像獲取應用程序實現

        • 從上面的結果中獲取一個數據單元并將其粘貼到此在線實用程序中,以便可以讀取其模式以生成一堆Java類,只需單擊一下即可。

          一個使用MVP模式的簡單圖像獲取應用程序實現

        興趣點

        • MVP模式用于分離關注點;
        • 該應用程序從imgur的webservice獲取圖像數據;
        • 改造HTTP客戶端框架用于數據獲取目的;
        • 畢加索圖像庫用于圖像渲染。

        如何使用代碼

        這很容易。啟動Android Studio,加載下載的源并單擊“運行”
        項目源碼及演示apk下載:鏈接: https://pan.baidu.com/s/1JiMSoKEl9DiOnDzIxGQO7w 密碼: 1jrz

        一個使用MVP模式的簡單圖像獲取應用程序實現轉載http://www.rhcg.tw/appboke/38810.html
        標簽:網站源碼
        辽宁十一选五单双