Android 框架 Retrofit+Rxjava+Glide 經典使用

katal 8年前發布 | 19K 次閱讀 Retrofit RxJava Android開發 移動開發

EasyFrame 3.0.0 網絡框架使用說明

EasyFrame3.0.0 是采用 RxJava 和 Retrofit 實現的網絡處理架構,采用 Glide 作為圖片處理架構。極大的簡化了APP開發中的框架搭建,library項目已經上傳 Jcenter 和 Maven 庫。

Jcenter:

compile 'com.qy.easyframe:easyframe:3.0.0'

Maven:

<dependency>
  <groupId>com.qy.easyframe</groupId>
  <artifactId>easyframe</artifactId>
  <version>3.0.0</version>
  <type>pom</type>
</dependency>

使用方法:

一.網絡請求的回調接口為ResultSubscriber.OnResultListener在請求網絡的界面或者業務邏輯中實現此接口并實現接口的三個方法,分別是:

/**

 * 網絡請求訂閱開始
 */
void onStart(int requestType);

/**
 * 網絡請求錯誤
 */
void onError(int requestType,Throwable e);

/**
 * 處理請求結果
 */
void onResult(IModel model, int requestType);</code></pre> 

三個方法看名字就知道對應的功能,其中 requestType 字段為不同網絡請求的標示,可以自行區分。IModel 類為返回的json字段對應的 JavaBean 類的公共父類,所有的 Response 的類,都要繼承 IModel 類。

二.定義你的針對 Retrofit 的網絡請求接口,如下:

/**
 * @Author: qiyuan
 * @Data: 16/4/12 下午2:57
 * @Description:  網絡請求接口
 */
public interface INetInterface {
    /**
     * get 請求
     * @param city
     * @return
     */
    @GET("data/cityinfo/{city_id}")
    Observable<WeatherResponse> getWeather(@Path("city_id") String city);

    /**
     * post 請求
     * @param body javabean請求體
     * @return
     */
    @POST("data/cityinfo/")
    Observable<WeatherResponse> postWeather(@Body WeatherRequest body);

    /**
     * post請求
     * @param params 表單
     * @return
     */
    @POST("data/cityinfo/")
    Observable<WeatherResponse> postWeather2(@FieldMap Map<String, String> params);
}

如上接口,需要自定義的地方有:

  • 請求方式的注解內的字符串,替換成自己的除主機地址外的地址或者全地址(通常是除主機外的地址)
  • Observable中的泛型,是網絡請求響應回來的json字符串對應的JavaBean對象,統一繼承IModel父類
  • 方法名當然是自己起名字啦。。

    注意

    此接口不能有繼承關系

三.定義第二步網絡請求接口的實現類,如下:

/**
 * @Author: qiyuan
 * @Data: 16/10/25 下午3:24
 * @Description: HTTP請求實現類
 */

public class HttpRequest {

    public HttpRequest() {
    }

    /**
     * 單例控制器
     */
    private static class SingletonHolder {
        private static final HttpRequest INSTANCE = new HttpRequest();
    }
    /**
     * 獲取單例對象
     *
     * @return
     */
    public static HttpRequest getInstance() {
        return HttpRequest.SingletonHolder.INSTANCE;
    }

    /**
     * get獲取網絡數據的方法
     *
     * @param cityId
     */
    public Subscriber getWeather(String cityId, int resultType, ResultSubscriber.OnResultListener listener) {
        Observable<WeatherResponse> observable = HTTPHelper.getInstance().init(Constant.BASE_PATH, INetInterface.class).getWeather(cityId);
        return HTTPHelper.getInstance().doRequest(observable, resultType, listener);
    }

    /**
     * post獲取網絡數據的方法
     *
     * @param body
     */
    public Subscriber postWeather(WeatherRequest body, int resultType, ResultSubscriber.OnResultListener listener) {
        Observable<WeatherResponse> observable = HTTPHelper.getInstance().init(Constant.BASE_PATH, INetInterface.class).postWeather(body);
        return HTTPHelper.getInstance().doRequest(observable, resultType, listener);
    }

    /**
     * 自定義headers
     * @param cityId
     * @param resultType
     * @param listener
     * @return
     */
    public Subscriber getRecommendDetails(String cityId, int resultType, ResultSubscriber.OnResultListener listener) {
        Map<String, String> map = new HashMap<>();
        map.put("X-Token", "595a6e93-bddb-47af-a7ce-e63801315fd9");
//        Headers headers = Headers.of(map);
//        Observable<T> observable = (Observable<T>)     HTTPHelper.getInstance().init(Constant.BASE_PATH, INetInterface.class, headers).getRecommendDetails(assetId);
        Observable<WeatherResponse> observable = HTTPHelper.getInstance().init(Constant.BASE_PATH, INetInterface.class, map).getWeather(cityId);
        return HTTPHelper.getInstance().doRequest(observable, resultType, listener);
    }

}

此類是對第二步接口類的實現,具體接口得實現是在

HTTPHelper.getInstance().init(Constant.BASE_PATH, INetInterface.class)

方法中操作,只需要講第二步中的接口得class對象傳入即可。

HTTPHelper.getInstance().doRequest(observable, resultType, listener)

此方法返回Subscriber對象,可以用此對象來中斷網絡操作,比如在界面銷毀時中斷。

Activity或者Fragment或者其他業務中的使用

比如demo中的點擊事件中,直接調用上一步的接口實現類的方法,并傳遞對應參數。
mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i(TAG,"onClick");
            HttpRequest.getInstance().getWeather("101010300.html",CODE,MainActivity.this);
        }
    });

總結

三步實現網絡請求
    1.實現ResultSubscriber.OnResultListener監聽
    2.實現對應網絡請求的接口類
    3.對接口類進行實現
    4.由于library不能從BuildConfig中讀取Debug狀態,如果調試期間需要打印log日志,
    可在Application中添加AppFrame.initDebug(true)方法

HTTPHelper類中的初始化方法如下

<T extends IModel> Subscriber    doRequest(<any> observable, int resultType, ResultSubscriber.OnResultListener listener)
初始化觀察者
static HTTPHelper getInstance()
獲取單例對象
Interceptor    getInterceptor()
獲取攔截器
<I> I    init(String baseUrl, Class<I> clazz)
初始化
<I> I    init(String baseUrl, Class<I> clazz, Headers headers) 
<I> I    init(String baseUrl, Class<I> clazz, long timeOut)
初始化
<I> I    init(String baseUrl, Class<I> clazz, long timeOut, Headers headers) 
HTTPHelper    setInterceptor(Interceptor mInterceptor)
設置攔截器

Glide圖片工具類使用方法及說明

static void initImageIcon(int id) 
初始化默認的加載圖
static void    into(android.content.Context context, File file, android.widget.ImageView view)
glide 從文件中加載圖片
static void    into(android.content.Context context, File file, android.widget.ImageView view, int width, int height)
glide 通過指定的大小從文件中加載圖片
static void    into(android.content.Context context, int resourceId, android.widget.ImageView view)
glide 從資源ID中加載圖片
static void    into(android.content.Context context, int resourceId, android.widget.ImageView view, int width, int height)
glide 通過指定的大小從資源ID中加載圖片
static void    into(android.content.Context context, String url, android.widget.ImageView view)
glide 從字符串中加載圖片(網絡地址或者本地地址)
static void    into(android.content.Context context, String url, android.widget.ImageView view, int defaultId)
glide 從字符串中加載圖片(網絡地址或者本地地址),
static void    into(android.content.Context context, String url, android.widget.ImageView view, int width, int height)
glide 通過指定的大小從字符串中加載圖片(網絡地址或者本地地址)
static void    into(android.content.Context context, android.net.Uri uri, android.widget.ImageView view)
glide 從URI中加載圖片
static void    into(android.content.Context context, android.net.Uri uri, android.widget.ImageView view, int width, int height)
glide 通過指定的大小從Uri中加載圖片
static void    intoBlur(android.content.Context context, String url, android.widget.ImageView view)
高斯模糊圖片處理
static void    intoDefault(android.content.Context context, int id, android.widget.ImageView view)
默認glide,不做任何處理
static void    intoDefault(android.content.Context context, String url, android.widget.ImageView view)
默認glide,不做任何處理
static void    intoRound(android.content.Context context, int id, int radius, android.widget.ImageView view)
圓或者圓角圖片處理
static void    intoRound(android.content.Context context, String url, int radius, android.widget.ImageView view)
圓或者圓角圖片處理
static void    intoRound(android.content.Context context, String url, int radius, android.widget.ImageView view, int defaultId)
從字符串中加載圓形圖片(網絡地址或者本地地址)

數據庫處理方法

數據庫為抽取的 xUtils 3.0 框架.

 

 

 本文由用戶 katal 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!