1. 程式人生 > >安卓專案實戰之:最實用的Retrofit2+RxJava2+MVP框架搭建,避免各種記憶體洩漏

安卓專案實戰之:最實用的Retrofit2+RxJava2+MVP框架搭建,避免各種記憶體洩漏

工程目錄結構

在這裡插入圖片描述
目前網上的mvp框架大多存在以下問題:
1,Presenter持有View的引用,容易導致出現記憶體洩漏

MvpPresenter mvpPresenter = new MvpPresenter(this);  // 不推薦這樣寫,持有activty引用,容易出現記憶體洩露

2,如果每一個Activity都對應一個Model和Presenter的話,試想一下,如果有幾百個Activity的話那麼是不是也要建立很多個Model和Presenter,關鍵是很多地方都是重複的可以通用的。所以,建立基類就顯得很有必要了,具體檢視本例寫法,優不優雅看過之後您評論。

新增依賴

// Retrofit
compile 'com.squareup.retrofit2:retrofit:2.4.0'
// Retrofit和jxjava關聯
compile 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
// Retrofit使用Gson轉換
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
// RxJava
compile 'io.reactivex.rxjava2:rxjava:2.1.12'
// RxAndroid
compile 'io.reactivex.rxjava2:rxandroid:2.0.2'

1,RetrofitHelper
主要用於Retrofit的初始化:

// 宣告Retrofit物件
    private Retrofit mRetrofit = null;
    OkHttpClient client = new OkHttpClient();

    // 由於該物件會被頻繁呼叫,採用單例模式,下面是一種執行緒安全模式的單例寫法,構造方法已被private修飾
    private volatile static RetrofitHelper instance = null;
    public static RetrofitHelper getInstance
(){ if (instance == null){ synchronized (RetrofitHelper.class) { if(instance == null){ instance = new RetrofitHelper(); } } } return instance; } private RetrofitHelper(){ initRetrofit(); } /** * 初始化 retrofit */ private void initRetrofit() { mRetrofit = new Retrofit.Builder() .baseUrl(UrlConstant.BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } public RetrofitService getServer(){ return mRetrofit.create(RetrofitService.class); }

其中getServer方法就是為了獲取RetrofitService介面類的例項化。然後定義了一個靜態方法getInstance用於獲取自身RetrofitHelper的例項化,並且只會例項化一次。

2,RetrofitService

public interface RetrofitService {
    @GET("book/search")
    Observable<Book> getSearchBooks(@Query("q") String name,
                                    @Query("tag") String tag, @Query("start") int start,
                                    @Query("count") int count);
}

3,DataManager

/**
 * 該類用來管理RetrofitService中對應的各種API介面
 * 當做Retrofit和presenter中的橋樑,Activity就不用直接和retrofit打交道了
 */

public class DataManager {

    private RetrofitService mRetrofitService;

    private DataManager(){
        this.mRetrofitService = RetrofitHelper.getInstance().getServer();
    }

    //由於該物件會被頻繁呼叫,採用單例模式,下面是一種執行緒安全模式的單例寫法,構造方法已被private修飾
    private volatile static DataManager instance;
    public static DataManager getInstance() {
        if (instance == null) {
            synchronized (DataManager.class) {
                if (instance == null) {
                    instance = new DataManager();
                }
            }
        }
        return instance;
    }


    // 將retrofit的業務方法對映到DataManager中,以後統一用該類來呼叫業務方法
    // 以後在RetrofitService中增加業務方法的時候,相應的這裡也要新增一個方法,建議方法名字相一致
    public Observable<Book> getSearchBooks(String name, String tag, int start, int count){
        return mRetrofitService.getSearchBooks(name,tag,start,count);
    }
}

這個類其實就是為了讓你更方便的呼叫RetrofitService 中定義的方法,可以看到,在它的構造方法中,我們得到了RetrofitService 的例項化,然後定義了一個和RetrofitService 中同名的方法,裡面其實就是呼叫RetrofitService 中的這個方法。這樣,把RetrofitService 中定義的方法都封裝到DataManager 中,以後無論在哪個要呼叫方法時直接在DataManager 中呼叫就可以了,而不是重複建立RetrofitService 的例項化,再呼叫其中的方法。

4,其中bean下放我們請求的實體類,這裡就是Book

package com.gpf.mvp.service.bean;

import java.util.List;

/**
 * Created by Administrator on 2018/11/23.
 */

public class Book {

    /**
     * count : 1
     * start : 0
     * total : 20
     * books : [{"rating":{"max":10,"numRaters":3342,"average":"7.9","min":0},"subtitle":"西北有雛鳳","author":["烽火戲諸侯"],"pubdate":"2013-9-1","tags":[{"count":520,"name":"烽火戲諸侯","title":"烽火戲諸侯"},{"count":477,"name":"武俠","title":"武俠"},{"count":436,"name":".好書,很值得一看。","title":".好書,很值得一看。"},{"count":381,"name":"雪中悍刀行,你值得擁有","title":"雪中悍刀行,你值得擁有"},{"count":365,"name":"達到了我對武俠江湖的那個感覺~人物特點脫出。文筆好。。希望烽火","title":"達到了我對武俠江湖的那個感覺~人物特點脫出。文筆好。。希望烽火"},{"count":301,"name":"小說","title":"小說"},{"count":276,"name":"新武俠","title":"新武俠"},{"count":208,"name":"玄幻","title":"玄幻"}],"origin_title":"小二  上酒","image":"https://img3.doubanio.com/view/subject/m/public/s27142913.jpg","binding":"平裝","translator":[],"catalog":"第一章 六千里歸鄉上酒,白狐臉佩刀入城\n老僕笑得很淳樸很燦爛,一張老臉像只有出了遠門到了荒郊才能瞅見的大片蘆葦叢,可能談不上旖旎或者壯闊,卻有著自己的情懷。\n第二章 武媚娘遙望城頭,湖心裡老魁帶刀\n枯槁如鬼的男人開口,如一股子金石聲,\u201c從一品。閣內修行十年,可此下眾生,此上無人。\u201d\n第三章 蓮花峰騎牛問道,武帝城豎劍留語\n洪洗象等世子殿下走遠了,然後姿勢不雅地蹲著,雙手託著腮幫,怔怔出神,喃喃自語:\u201c紅豆生南國,春來發枝冬凋敝,相思不如不相思。\u201d\n第四章 赴城外殺人賞雪,上武當姜泥送書\n天底下什麼東西最重?情義?忠孝?放屁,是書最重。\n第五章 拔悍刀血戰雙衛,大庚角留帖離山\n徐鳳年記起三年遊歷中在洛水河畔,遠遠看到的一個窈窕背影,怔怔出神道:\u201c相思刀最是能殺人。\n第六章 老掌教黃庭作嫁,小和尚秀色參禪\n你便是我的禪,秀色可\u201c參\u201d。\n第七章 北涼歌再奠英靈,陰陽間喝酒換刀\n白狐兒臉說了句幾乎讓徐鳳年吐血的話,\u201c你要是女人就好了,我便娶了你。\u201d\n第八章 憶王妃老卒瞑目,出涼州世子挎刀\n徐鳳年丟掉樹葉,膝上疊放著繡冬、春雷雙刀,望著墓碑柔聲道:\u201c娘,你的仇,徐驍不報,鳳年還記著呢。\u201d\n第九章 紅符甲大雨攔道,老劍神初顯身手\n魏爺爺,你說一品有四重,金剛之上是指玄。原來一彈玄機即指玄。\n第十章 晉蘭亭魚躍龍門,青城山怒斬馬賊\n\u201c溫華,沒錢買不起好劍又何妨,希望你小子能一直提著把破木劍去名動天下。到時候按照兄弟約定,你請我吃牛肉,我給你叫好。\u201d\n第十一章 山河圖隨行細繪,青羊宮闖陣玉宵\n北涼鐵騎甲天下,不是靠文人士子用嘴喊出來的,而是馬踏六國加上半座江湖一個一個鐵蹄踩踏出來的!\n第十二章 滾刀術先手五十,北涼王悍然入宮\n他便一直擦下去,哽咽著溫柔道:\u201c姑姑好看,姑姑不哭。\u201d","pages":"320","images":{"small":"https://img3.doubanio.com/view/subject/s/public/s27142913.jpg","large":"https://img3.doubanio.com/view/subject/l/public/s27142913.jpg","medium":"https://img3.doubanio.com/view/subject/m/public/s27142913.jpg"},"alt":"https://book.douban.com/subject/25714176/","id":"25714176","publisher":"江蘇文藝出版社","isbn10":"7539962879","isbn13":"9787539962870","title":"雪中悍刀行 1","url":"https://api.douban.com/v2/book/25714176","alt_title":"小二  上酒","author_intro":"2005年底烽火開始在起點中文網發文,後一直以挖\u201c坑\u201d不填而廣受讀者抱怨,因此被稱為\u201c大內太監總管\u201d。 代表作《陳二狗的妖孽人生》《極品公子》《天神下凡》等\n其作品訂閱極高、口碑極好,但是他毅然太監,絕不\u201c出宮\u201d。更新速度猶如龜爬,馬甲眾多!其馬甲有:婆娑世界教主、八部浮屠。\n2010年4月,烽火轉戰縱橫中文網。如今,他毅然\u201c出宮\u201d,更是執著一把悍刀,帶著第一本完美收官之作徵這出版之道!試問,八百白袍,今安在?","summary":"道門真人飛天入地,千里取人首級;佛家菩薩低眉怒目,擡手可撼崑崙;誰又言書生無意氣,一怒敢叫天子露戚容。踏江踏湖踏歌,我有一劍仙人跪;提刀提劍提酒,三十萬鐵騎徵天。\n老僕劍九背匣,呂祖修道騎牛,天道悠悠難覓,情之一字可殺人。\n漠北黃沙如刀舞, 世子白馬出北涼,身後跟著一百佩刀甲士。\n鮮衣怒馬,美婢嬌娘,還有一個摳腳的斷臂老人。\n猶記得跟缺門牙老黃的那段對話。\n\u201c老黃,你是高手嗎?\u201d\n\u201c是哩。\u201d\n\u201c有多高?\u201d\n\u201c嘖嘖,只比公子差一點點。\u201d\n回想當初自己不屑地吐出黃瓜花兒,還罵了句去你孃的。卻不承想,那老黃乃是傳說中高手中的高手。這世道果然難測。\n世子如今帶雙刀,劍神武夫,江湖廟堂,可否一併斬之?","series":{"id":"20883","title":"雪中悍刀行"},"price":"25.00元"}]
     */

    private int count;
    private int start;
    private int total;
    private List<BooksBean> books;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public List<BooksBean> getBooks() {
        return books;
    }

    public void setBooks(List<BooksBean> books) {
        this.books = books;
    }

    public static class BooksBean {

        /**
         * rating : {"max":10,"numRaters":3342,"average":"7.9","min":0}
         * subtitle : 西北有雛鳳
         * author : ["烽火戲諸侯"]
         * pubdate : 2013-9-1
         * tags : [{"count":520,"name":"烽火戲諸侯","title":"烽火戲諸侯"},{"count":477,"name":"武俠","title":"武俠"},{"count":436,"name":".好書,很值得一看。","title":".好書,很值得一看。"},{"count":381,"name":"雪中悍刀行,你值得擁有","title":"雪中悍刀行,你值得擁有"},{"count":365,"name":"達到了我對武俠江湖的那個感覺~人物特點脫出。文筆好。。希望烽火","title":"達到了我對武俠江湖的那個感覺~人物特點脫出。文筆好。。希望烽火"},{"count":301,"name":"小說","title":"小說"},{"count":276,"name":"新武俠","title":"新武俠"},{"count":208,"name":"玄幻","title":"玄幻"}]
         * origin_title : 小二  上酒
         * image : https://img3.doubanio.com/view/subject/m/public/s27142913.jpg
         * binding : 平裝
         * translator : []
         * catalog : 第一章 六千里歸鄉上酒,白狐臉佩刀入城
         老僕笑得很淳樸很燦爛,一張老臉像只有出了遠門到了荒郊才能瞅見的大片蘆葦叢,可能談不上旖旎或者壯闊,卻有著自己的情懷。
         第二章 武媚娘遙望城頭,湖心裡老魁帶刀
         枯槁如鬼的男人開口,如一股子金石聲,“從一品。閣內修行十年,可此下眾生,此上無人。”
         第三章 蓮花峰騎牛問道,武帝城豎劍留語
         洪洗象等世子殿下走遠了,然後姿勢不雅地蹲著,雙手託著腮幫,怔怔出神,喃喃自語:“紅豆生南國,春來發枝冬凋敝,相思不如不相思。”
         第四章 赴城外殺人賞雪,上武當姜泥送書
         天底下什麼東西最重?情義?忠孝?放屁,是書最重。
         第五章 拔悍刀血戰雙衛,大庚角留帖離山
         徐鳳年記起三年遊歷中在洛水河畔,遠遠看到的一個窈窕背影,怔怔出神道:“相思刀最是能殺人。
         第六章 老掌教黃庭作嫁,小和尚秀色參禪
         你便是我的禪,秀色可“參”。
         第七章 北涼歌再奠英靈,陰陽間喝酒換刀
         白狐兒臉說了句幾乎讓徐鳳年吐血的話,“你要是女人就好了,我便娶了你。”
         第八章 憶王妃老卒瞑目,出涼州世子挎刀
         徐鳳年丟掉樹葉,膝上疊放著繡冬、春雷雙刀,望著墓碑柔聲道:“娘,你的仇,徐驍不報,鳳年還記著呢。”
         第九章 紅符甲大雨攔道,老劍神初顯身手
         魏爺爺,你說一品有四重,金剛之上是指玄。原來一彈玄機即指玄。
         第十章 晉蘭亭魚躍龍門,青城山怒斬馬賊
         “溫華,沒錢買不起好劍又何妨,希望你小子能一直提著把破木劍去名動天下。到時候按照兄弟約定,你請我吃牛肉,我給你叫好。”
         第十一章 山河圖隨行細繪,青羊宮闖陣玉宵
         北涼鐵騎甲天下,不是靠文人士子用嘴喊出來的,而是馬踏六國加上半座江湖一個一個鐵蹄踩踏出來的!
         第十二章 滾刀術先手五十,北涼王悍然入宮
         他便一直擦下去,哽咽著溫柔道:“姑姑好看,姑姑不哭。”
         * pages : 320
         * images : {"small":"https://img3.doubanio.com/view/subject/s/public/s27142913.jpg","large":"https://img3.doubanio.com/view/subject/l/public/s27142913.jpg","medium":"https://img3.doubanio.com/view/subject/m/public/s27142913.jpg"}
         * alt : https://book.douban.com/subject/25714176/
         * id : 25714176
         * publisher : 江蘇文藝出版社
         * isbn10 : 7539962879
         * isbn13 : 9787539962870
         * title : 雪中悍刀行 1
         * url : https://api.douban.com/v2/book/25714176
         * alt_title : 小二  上酒
         * author_intro : 2005年底烽火開始在起點中文網發文,後一直以挖“坑”不填而廣受讀者抱怨,因此被稱為“大內太監總管”。 代表作《陳二狗的妖孽人生》《極品公子》《天神下凡》等
         其作品訂閱極高、口碑極好,但是他毅然太監,絕不“出宮”。更新速度猶如龜爬,馬甲眾多!其馬甲有:婆娑世界教主、八部浮屠。
         2010年4月,烽火轉戰縱橫中文網。如今,他毅然“出宮”,更是執著一把悍刀,帶著第一本完美收官之作徵這出版之道!試問,八百白袍,今安在?
         * summary : 道門真人飛天入地,千里取人首級;佛家菩薩低眉怒目,擡手可撼崑崙;誰又言書生無意氣,一怒敢叫天子露戚容。踏江踏湖踏歌,我有一劍仙人跪;提刀提劍提酒,三十萬鐵騎徵天。
         老僕劍九背匣,呂祖修道騎牛,天道悠悠難覓,情之一字可殺人。
         漠北黃沙如刀舞, 世子白馬出北涼,身後跟著一百佩刀甲士。
         鮮衣怒馬,美婢嬌娘,還有一個摳腳的斷臂老人。
         猶記得跟缺門牙老黃的那段對話。
         “老黃,你是高手嗎?”
         “是哩。”
         “有多高?”
         “嘖嘖,只比公子差一點點。”
         回想當初自己不屑地吐出黃瓜花兒,還罵了句去你孃的。卻不承想,那老黃乃是傳說中高手中的高手。這世道果然難測。
         世子如今帶雙刀,劍神武夫,江湖廟堂,可否一併斬之?
         * series : {"id":"20883","title":"雪中悍刀行"}
         * price : 25.00元
         */

        private RatingBean rating;
        private String subtitle;
        private String pubdate;
        private String origin_title;
        private String image;
        private String binding;
        private String catalog;
        private String pages;
        private ImagesBean images;
        private String alt;
        private String id;
        private String publisher;
        private String isbn10;
        private String isbn13;
        private String title;
        private String url;
        private String alt_title;
        private String author_intro;
        private String summary;
        private SeriesBean series;
        private String price;
        private List<String> author;
        private List<TagsBean> tags;
        private List<?> translator;

        public RatingBean getRating() {
            return rating;
        }

        public void setRating(RatingBean rating) {
            this.rating = rating;
        }

        public String getSubtitle() {
            return subtitle;
        }

        public void setSubtitle(String subtitle) {
            this.subtitle = subtitle;
        }

        public String getPubdate() {
            return pubdate;
        }

        public void setPubdate(String pubdate) {
            this.pubdate = pubdate;
        }

        public String getOrigin_title() {
            return origin_title;
        }

        public void setOrigin_title(String origin_title) {
            this.origin_title = origin_title;
        }

        public String getImage() {
            return image;
        }

        public void setImage(String image) {
            this.image = image;
        }

        public String getBinding() {
            return binding;
        }

        public void setBinding(String binding) {
            this.binding = binding;
        }

        public String getCatalog() {
            return catalog;
        }

        public void setCatalog(String catalog) {
            this.catalog = catalog;
        }

        public String getPages() {
            return pages;
        }

        public void setPages(String pages) {
            this.pages = pages;
        }

        public ImagesBean getImages() {
            return images;
        }

        public void setImages(ImagesBean images) {
            this.images = images;
        }

        public String getAlt() {
            return alt;
        }

        public void setAlt(String alt) {
            this.alt = alt;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getPublisher() {
            return publisher;
        }

        public void setPublisher(String publisher) {
            this.publisher = publisher;
        }

        public String getIsbn10() {
            return isbn10;
        }

        public void setIsbn10(String isbn10) {
            this.isbn10 = isbn10;
        }

        public String getIsbn13() {
            return isbn13;
        }

        public void setIsbn13(String isbn13) {
            this.isbn13 = isbn13;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public String getAlt_title() {
            return alt_title;
        }

        public void setAlt_title(String alt_title) {
            this.alt_title = alt_title;
        }

        public String getAuthor_intro() {
            return author_intro;
        }

        public void setAuthor_intro(String author_intro) {
            this.author_intro = author_intro;
        }

        public String getSummary() {
            return summary;
        }

        public void setSummary(String summary) {
            this.summary = summary;
        }

        public SeriesBean getSeries() {
            return series;
        }

        public void setSeries(SeriesBean series) {
            this.series = series;
        }

        public String getPrice() {
            return price;
        }

        public void setPrice(String price) {
            this.price = price;
        }

        public List<String> getAuthor() {
            return author;
        }

        public void setAuthor(List<String> author) {
            this.author = author;
        }

        public List<TagsBean> getTags() {
            return tags;
        }

        public void setTags(List<TagsBean> tags) {
            this.tags = tags;
        }

        public List<?> getTranslator() {
            return translator;
        }

        public void setTranslator(List<?> translator) {
            this.translator = translator;
        }

        @Override
        public String toString() {
            return "BooksBean{" +
                    "rating=" + rating +
                    ", subtitle='" + subtitle + '\'' +
                    ", pubdate='" + pubdate + '\'' +
                    ", origin_title='" + origin_title + '\'' +
                    ", image='" + image + '\'' +
                    ", binding='" + binding + '\'' +
                    ", catalog='" + catalog + '\'' +
                    ", pages='" + pages + '\'' +
                    ", images=" + images +
                    ", alt='" + alt + '\'' +
                    ", id='" + id + '\'' +
                    ", publisher='" + publisher + '\'' +
                    ", isbn10='" + isbn10 + '\'' +
                    ", isbn13='" + isbn13 + '\'' +
                    ", title='" + title + '\'' +
                    ", url='" + url + '\'' +
                    ", alt_title='" + alt_title + '\'' +
                    ", author_intro='" + author_intro + '\'' +
                    ", summary='" + summary + '\'' +
                    ", series=" + series +
                    ", price='" + price + '\'' +
                    ", author=" + author +
                    ", tags=" + tags +
                    ", translator=" + translator +
                    '}';
        }

        public static class RatingBean {
            /**
             * max : 10
             * numRaters : 3342
             * average : 7.9
             * min : 0
             */

            private int max;
            private int numRaters;
            private String average;
            private int min;

            public int getMax() {
                return max;
            }

            public void setMax(int max) {
                this.max = max;
            }

            public int getNumRaters() {
                return numRaters;
            }

            public void setNumRaters(int numRaters) {
                this.numRaters = numRaters;
            }

            public String getAverage(
            
           

相關推薦

專案實戰實用Retrofit2+RxJava2+MVP框架搭建避免各種記憶體洩漏

工程目錄結構 目前網上的mvp框架大多存在以下問題: 1,Presenter持有View的引用,容易導致出現記憶體洩漏 MvpPresenter mvpPresenter = new MvpPresenter(this); // 不推薦這樣寫,持有activty引用,容易出現

專案實戰實用的載入中、無網路、無資料、出錯四種情況切換庫的使用總結

效果圖 錄出來的效果不是很好,真機上展示效果還算完美。 如圖所示該效果的實現依賴三個庫: 1,頂部Tab導航:比TabLayout功能更強大的FlycoTabLayout,具體使用檢視本人之前部落格:安卓專案實戰之:FlycoTabLayout和FlycoRoundView的介紹及

專案實戰ToolBar的使用介紹

ToolBar簡介 Toolbar是谷歌在2014年Google IO 大會上推出的一套全新的設計規範Material Design中的控制元件之一,主要是用來在android 5.0之後代替Android傳統的標題欄ActionBar的,引入在android-support-v7相

專案實戰7.0優化下的全域性網路連線狀態監聽

須知:Android7.0起網路變化監聽隱式廣播被關閉 在 Android 7.0 版本中除了提供諸多多視窗支援、活動通知、後臺優化、訊息傳遞服務和Vulkan 等新特性和功能外,還對系統和 API 行為做出了各種變更,其中最重要的一點:Android7.0為了進行後臺的優化刪除了三

專案實戰幫你從Glide3過渡到Glide4的完美攻略

Glide4:Glide3的優化版 相比於Glide 3 而言,Glide4並不能算是有什麼突破性的升級,而更多的是一些API工整方面的優化,相比於Glide3的API,Glide4進行了更加科學合理的調整,使得易讀性,易寫性,可擴充套件性等方面都有了不錯的提升,但如果你已經對Glide

專案實戰開源框架BaseRecyclerViewAdapterHelper的使用

新增依賴 1,在Project的build.gradle檔案下新增: allprojects { repositories { ... maven { url "https://jitpack.io" }

專案實戰強大的網路請求框架okGo使用詳解(六)擴充套件專案okServer更強大的下載上傳功能支援斷點和多工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

專案實戰強大的網路請求框架okGo使用詳解(五)擴充套件專案okRx完美結合RxJava

前言 在第一篇講解okGo框架新增依賴支援時,還記得我們額外新增的兩個依賴嗎,一個okRx和一個okServer,這兩個均是基於okGo框架的擴充套件專案,其中okRx可以使請求結合RxJava一起使用,而okServer則提供了強大的下載上傳功能,如斷點支援,多工管理等,本篇我們主要講

專案實戰強大的網路請求框架okGo使用詳解(四)Cookie的管理

Cookie概念相關 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制是需要藉助於cookie機制來達到儲存標識的目的,所謂ses

專案實戰強大的網路請求框架okGo使用詳解(三)快取的使用

相關實體類必須實現序列化介面 使用快取前,必須讓涉及到快取javaBean物件實現Serializable介面,否者會報NotSerializableException。因為快取的原理是將物件序列化後直接寫入資料庫中,如果不實現Serializable介面,會導致物件無法序列化,進而無法

專案實戰強大的網路請求框架okGo使用詳解(二)深入理解Callback自定義JsonCallback

前言 JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快了傳輸速度,目前客戶端伺服器返回的資料大多都是基於這種格式的,相應的我們瞭解的關於json的解析工具主要有兩個:Gson(Google官方出的)和fas

專案實戰強大的網路請求框架okGo使用詳解(一)實現getpost基本網路請求下載上傳進度監聽以及對Callback自定義的深入理解

1.新增依賴 //必須使用 compile 'com.lzy.net:okgo:3.0.4' //以下三個選擇新增,okrx和okrx2不能同時使用,一般選擇新增最新的rx2支援即可 compile 'com.lzy.net:okrx:1.0.2' compile 'com.lzy

專案實戰Glide 3高手養成(三)Glide的回撥與監聽

前言 通過前面兩篇的講解,我們對於Glide的一些使用都有了基本瞭解,知道了使用Glide載入圖片只需要一行程式碼即可: Glide.with(this).load(url).into(imageView); 而在這一行程式碼的背後,Glide幫我們執行了成千上萬行的邏輯。

專案實戰Glide 3高手養成(二)Glide強大的圖片變換功能

使用Glide時普遍會遇到的一個問題,如何解決? 首先我們嘗試使用Glide來載入一張圖片,圖片URL地址是:https://www.baidu.com/img/bd_logo1.png 這是百度首頁logo的一張圖片,圖片尺寸是540*258畫素。 接下來我們編寫一個非常簡單的佈局檔案

專案實戰Glide 3高手養成(一)Glide的基本使用

前言 現在Android上的圖片載入框架非常成熟,從最早的老牌圖片載入框架UniversalImageLoader,到後來Google推出的Volley,再到後來的新興軍Glide和Picasso,當然還有Facebook的Fresco。每一個都非常穩定,功能也都十分強大。但是它們的使用

專案實戰與UI那點事圖片適配你必須要了解的知識點

1,mipmap和drawable的區別 在Android4.2以上的版本中,提供了對mipmaps的支援,如果你用Andorid Studio開發Android程式會發現Android Studio自動幫你建立了幾個mipmaps資料夾,很多人每次新建一個工程的時候,總是先把mipma

專案實戰關於獲取SD卡指定路徑和檔案的講解

前言 當我們將手機連線到電腦上時,我們發現在SD卡的根目錄下生成了成百上千的由各種應用程式建立的資料夾,導致我們也不知道哪個資料夾是用來幹嘛的,這正因為這樣安卓開發人員經常受到使用者的吐槽。 的確作為一個安卓開發者,我們的確不應該將我們應用的資料直接存到SD卡的根目錄下,這樣當手機安

專案實戰Activity啟動過程中動態獲取元件寬高的3種方式

前言 有時候我們需要在Activity啟動的時候獲取某一元件的寬或者是高用於動態的更改UI佈局,但是這時候我們直接通過getWidth和getHeight方法獲取是有問題的,如下: 我們在Activity的onCreate方法中呼叫如下的方法來獲取元件的寬高: /** * 在onC

專案實戰設定Activity跳轉動畫的5種實現方式

前言 在介紹activity的切換動畫之前我們先來說明一下實現切換activity的兩種方式: 1,呼叫startActivity方法啟動一個新的Activity並跳轉其頁面 2,呼叫finish方法銷燬當前的Activity返回上一個Activity介面 當呼叫startActiv

專案實戰如何debug執行具有release簽名的apk

需求分析 眾所周知,Android的安裝包有測試包(debug版本)和正式包(release版本)之分,一般我們測試時安裝的debug版本預設採用的簽名都是系統幫我們提供的debug.keystore簽名檔案,該檔案位於C:\Users\Administrator.android目錄