天天看點

Android網絡請求架構之Retrofit實踐

網絡通路架構經過了從使用最原始的asynctask建構簡單的網絡通路架構(甚至不能稱為架構),後來使用開源的android-async-http庫,再到使用google釋出的volley庫,一直不懈的尋找更好的解決方案,到現在也沒找到,不過據行業所說,retrofit算是行業比較牛逼的開源請求架構了吧,也算找 到了一些更好的方案,在這裡做些記錄,也做共享。

下面是我們常用的mvp模式的運作模型:

Android網絡請求架構之Retrofit實踐

retrofit:square提供的開源産品,為android平台的應用提供一個類型安全的rest用戶端

https://github.com/square/retrofit  

rxandroid:響應式程式設計架構rxjava針對android平台的擴充。

https://github.com/reactivex/rxandroid  

https://github.com/reactivex/rxjava  

dagger2:依賴注入(或叫ioc,用過spring的都知道這東東)架構,用于解耦的。

https://github.com/google/dagger/  

為了書寫 友善,便于實踐,我們用下面的位址作為伺服器請求位址:http://ip.taobao.com/service/getipinfo.php?ip=21.22.11.33

接下來我們開始建立一個項目;

Android網絡請求架構之Retrofit實踐

1、通過配置gradle配置将retrofit架構引入項目。

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'  

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'  

2、編寫api服務代碼

package com.micky.retrofitrxandroiddagger2.data.api;  

import com.micky.retrofitrxandroiddagger2.data.api.response.getipinforesponse;  

import retrofit.call;  

import retrofit.http.get;  

import retrofit.http.query;  

import rx.observable;  

public interface apiservice {  

    @get("service/getipinfo.php")  

    call<getipinforesponse> getipinfo(@query("ip") string ip);  

}  

3、定義接收資料的response

package com.micky.retrofitrxandroiddagger2.data.api.response;  

import com.micky.retrofitrxandroiddagger2.data.api.model.ipinfo;  

public class getipinforesponse extends baseresponse {  

    public ipinfo data;  

4、請求資料并顯示

package com.micky.retrofitrxandroiddagger2;  

import android.os.bundle;  

import android.support.design.widget.floatingactionbutton;  

import android.support.v7.app.appcompatactivity;  

import android.support.v7.widget.toolbar;  

import android.view.view;  

import android.view.menu;  

import android.view.menuitem;  

import android.widget.progressbar;  

import android.widget.textview;  

import android.widget.toast;  

import com.micky.retrofitrxandroiddagger2.common.utils.crashhandler;  

import com.micky.retrofitrxandroiddagger2.data.api.apiservice;  

import retrofit.callback;  

import retrofit.gsonconverterfactory;  

import retrofit.response;  

import retrofit.retrofit;  

import retrofit.rxjavacalladapterfactory;  

import rx.subscriber;  

import rx.android.schedulers.androidschedulers;  

import rx.functions.action1;  

import rx.schedulers.schedulers;  

public class mainactivity extends appcompatactivity {  

    private static final string endpoint = "http://ip.taobao.com";  

    private textview mtvcontent;  

    private progressbar mprogressbar;  

    @override  

    protected void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        setcontentview(r.layout.activity_main);  

        toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);  

        setsupportactionbar(toolbar);  

        mtvcontent = (textview) findviewbyid(r.id.tv_content);  

        mprogressbar = (progressbar) findviewbyid(r.id.progress_bar);  

        floatingactionbutton fab = (floatingactionbutton) findviewbyid(r.id.fab);  

        fab.setonclicklistener(new view.onclicklistener() {  

            @override  

            public void onclick(view view) {  

                retrofit retrofit = new retrofit.builder()  

                        .baseurl(endpoint)  

                        .addconverterfactory(gsonconverterfactory.create())  

                        .build();  

                apiservice apiservice = retrofit.create(apiservice.class);  

                mprogressbar.setvisibility(view.visible);  

                call<getipinforesponse> call = apiservice.getipinfo("63.223.108.42");  

                call.enqueue(new callback<getipinforesponse>() {  

                    @override  

                    public void onresponse(response<getipinforesponse> response, retrofit retrofit) {  

                        mprogressbar.setvisibility(view.gone);  

                        getipinforesponse getipinforesponse = response.body();  

                        mtvcontent.settext(getipinforesponse.data.country);  

                    }  

                    public void onfailure(throwable t) {  

                        mtvcontent.settext(t.getmessage());  

                });  

            }  

        });  

    }  

    public boolean oncreateoptionsmenu(menu menu) {  

        getmenuinflater().inflate(r.menu.menu_main, menu);  

        return true;  

    public boolean onoptionsitemselected(menuitem item) {  

        int id = item.getitemid();  

        if (id == r.id.action_settings) {  

            return true;  

        }  

        return super.onoptionsitemselected(item);  

繼續閱讀