XUtils3.0網(wǎng)絡(luò)框架的使用以及在項(xiàng)目中的二次封裝

上步驟:
1, 添加依賴


添加依賴.png

2,在application中初始化XUtils, 記得在清單文件中寫哦

初始化XUtils

3, 這個(gè).....NetRequestUtils代碼有點(diǎn)多:
import android.util.Log;

import com.diandou.bigdemo.utils.MLogUtil;
import com.google.gson.Gson;

import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;

import java.io.File;
import java.util.Map;

public class NetRequestUtil {

public final Gson gson = new Gson();
private volatile static NetRequestUtil instance;

/**
 * Double Check 單例模式
 *
 * @return
 */
public static NetRequestUtil getInstance() {
    if (instance == null) {
        synchronized (NetRequestUtil.class) {
            if (instance == null) {
                instance = new NetRequestUtil();
            }
        }
    }
    return instance;
}

/**
 * 網(wǎng)絡(luò)請(qǐng)求的接口回調(diào)監(jiān)聽器
 */
public interface NetResponseListener {
    void onSuccess(MResponse response, int requestCode);

    void onFailed(int requestCode);
}

/**
 * 文件下載的接口回調(diào)監(jiān)聽器
 */
public interface NetDownLoadFileListener extends NetResponseListener {

    void onSuccess(File response, int requestCode);

    void onLoading(long current, boolean isDownloading, int requestCode);
}

/**
 * 文件上傳的接口回調(diào)監(jiān)聽
 */
public interface NetUpLoadFileListener extends NetResponseListener {
    void onLoading(long current, boolean isDownloading, int requestCode);
}




/**
 * 異步get請(qǐng)求
 *
 * @param url
 * @param maps
 * @param requestCode
 * @param clazz
 * @param listener
 * @return
 */
public Callback.Cancelable get(String url, Map<String, String> maps, final int requestCode, final Class<? extends MResponse> clazz, final NetResponseListener listener) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
        for (Map.Entry<String, String> entry : maps.entrySet()) {
            params.addQueryStringParameter(entry.getKey(), entry.getValue());
        }
    }

    Callback.Cancelable cancelable = x.http().get(params, new Callback.CommonCallback<String>() {
        @Override
        public void onSuccess(String result) {
            MResponse mResponse = gson.fromJson(result, clazz);//按正常響應(yīng)解析
            listener.onSuccess(mResponse, requestCode);
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            listener.onFailed(requestCode);
        }

        @Override
        public void onCancelled(CancelledException cex) {
        }

        @Override
        public void onFinished() {

        }
    });
    return cancelable;
}

/**
 * 帶緩存的異步get請(qǐng)求
 *
 * @param url
 * @param maps
 * @param requestCode
 * @param clazz
 * @param listener
 * @return
 */
public Callback.Cancelable getCache(String url, Map<String, String> maps, final int requestCode, final Class<? extends MResponse> clazz, final NetResponseListener listener) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
        for (Map.Entry<String, String> entry : maps.entrySet()) {
            params.addQueryStringParameter(entry.getKey(), entry.getValue());
        }
    }

    // 默認(rèn)緩存存活時(shí)間, 單位:毫秒(如果服務(wù)器沒有返回有效的max-age或Expires則參考)
    params.setCacheMaxAge(1000 * 60);//設(shè)置緩存當(dāng)這個(gè)緩存事件過(guò)了的時(shí)候, 這時(shí)候就會(huì)不走這個(gè)onCache方法, 直接發(fā)起網(wǎng)絡(luò)請(qǐng)求,
    Callback.Cancelable cancelable = x.http().get(params, new Callback.CacheCallback<String>() {
        @Override
        public boolean onCache(String result) {
            MResponse mResponse = gson.fromJson(result, clazz);//按正常響應(yīng)解析
            listener.onSuccess(mResponse, requestCode);
            return true;//這里返回一個(gè)true, 就是走了cache就不再發(fā)起網(wǎng)絡(luò)請(qǐng)求了, 返回一個(gè)false, 就是不信任緩存數(shù)據(jù), 再次發(fā)起網(wǎng)絡(luò)請(qǐng)求
        }

        @Override
        public void onSuccess(String result) {
            if (result != null) {
                //如果走了cache方法返回了true, 將不再發(fā)起網(wǎng)絡(luò)請(qǐng)求, 這里拿到的result就是null,
                MResponse mResponse = gson.fromJson(result, clazz);//按正常響應(yīng)解析
                listener.onSuccess(mResponse, requestCode);
            }
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            listener.onFailed(requestCode);
        }

        @Override
        public void onCancelled(CancelledException cex) {
        }

        @Override
        public void onFinished() {
        }
    });
    return cancelable;
}

/**
 * 異步post請(qǐng)求
 *
 * @param url
 * @param maps
 * @param requestCode
 * @param clazz
 * @param listener
 * @return
 */
public Callback.Cancelable post(String url, Map<String, String> maps, final int requestCode, final Class<? extends MResponse> clazz, final NetResponseListener listener) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
        for (Map.Entry<String, String> entry : maps.entrySet()) {
            params.addBodyParameter(entry.getKey(), entry.getValue());
        }
    }

    Callback.Cancelable post = x.http().post(params, new Callback.CommonCallback<String>() {

        @Override
        public void onSuccess(String result) {
            MResponse mResponse = gson.fromJson(result, clazz);//按正常響應(yīng)解析
            listener.onSuccess(mResponse, requestCode);
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            listener.onFailed(requestCode);
        }

        @Override
        public void onCancelled(CancelledException cex) {
        }

        @Override
        public void onFinished() {

        }
    });
    return post;
}


/**
 * 文件上傳
 *
 * @param url
 * @param maps
 * @param file
 * @param requestCode
 * @param clazz
 * @param listener
 * @return
 */
public Callback.Cancelable upLoadFile(String url, Map<String, String> maps, Map<String, File> file, final int requestCode, final Class<? extends MResponse> clazz, final NetUpLoadFileListener listener) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
        for (Map.Entry<String, String> entry : maps.entrySet()) {
            params.addBodyParameter(entry.getKey(), entry.getValue());
        }
    }
    if (file != null && !maps.isEmpty()) {
        for (Map.Entry<String, File> entry : file.entrySet()) {
            params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile());
        }
    }
    // 有上傳文件時(shí)使用multipart表單, 否則上傳原始文件流.
    params.setMultipart(true);//這個(gè)是標(biāo)示上傳的文件內(nèi)容的,
    Callback.Cancelable cancelable = x.http().post(params, new Callback.ProgressCallback<String>() {

        @Override
        public void onSuccess(String result) {
            MResponse mResponse = gson.fromJson(result, clazz);//按正常響應(yīng)解析
            listener.onSuccess(mResponse, requestCode);
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            listener.onFailed(requestCode);
        }

        @Override
        public void onCancelled(CancelledException cex) {

        }

        @Override
        public void onFinished() {

        }

        @Override
        public void onWaiting() {

        }

        @Override
        public void onStarted() {

        }

        @Override
        public void onLoading(long total, long current, boolean isDownloading) {
            listener.onLoading(current, isDownloading, requestCode);
        }
    });

    return cancelable;
}

/**
 * 文件下載
 * @param url
 * @param filepath
 * @param requestCode
 * @param listener
 */
public void downLoadFile(String url, String filepath, final int requestCode, final NetDownLoadFileListener listener) {

    RequestParams params = new RequestParams(url);
    params.setAutoRename(true);// 斷點(diǎn)續(xù)傳, 也就是說(shuō)支持中斷之后再繼續(xù)下載,
    params.setSaveFilePath(filepath);//設(shè)置文件保存的路徑
    x.http().post(params, new Callback.ProgressCallback<File>() {
        @Override
        public void onSuccess(final File result) {
            listener.onSuccess(result, requestCode);
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            listener.onFailed(requestCode);
        }

        @Override
        public void onCancelled(CancelledException cex) {

        }

        @Override
        public void onFinished() {
        }

        @Override
        public void onWaiting() {

        }

        @Override
        public void onStarted() {

        }

        @Override
        public void onLoading(final long total, final long current, final boolean isDownloading) {
            listener.onLoading(current, isDownloading, requestCode);
        }
    });

}

}
還有一個(gè)GsonFormat之后的bean都要實(shí)現(xiàn)的一個(gè)接口
package com.diandou.bigdemo.utils.net;
public interface MResponse {
}

==========================================================
大家還要拿到cancle對(duì)象,神馬的, 在封裝baseActicity或者是BaseFragment在一起cancle掉網(wǎng)絡(luò)請(qǐng)求, 這樣放置奔潰哦

以上的普通的get.post網(wǎng)絡(luò)請(qǐng)求, 還有文件上傳和下載, 還有緩存實(shí)現(xiàn), 大家如果還有需要的, 在去自行封裝吧-_-

下面的這個(gè)是XUtils封裝成的圖片加載框架, 目前尚不算完善, 我會(huì)根據(jù)項(xiàng)目在去進(jìn)行封裝的, 要解決的有l(wèi)istview的view復(fù)用不讓其混亂, 下拉刷新的時(shí)候讓圖片不要閃, 之后要做到的我在更新上來(lái)哦

import android.widget.ImageView;

import org.xutils.image.ImageOptions;
import org.xutils.x;

public class MImageLoaderUtil {
private volatile static MImageLoaderUtil instance;

/**
 * Double Check 單例模式
 *
 * @return
 */
public static MImageLoaderUtil getInstance() {
    if (instance == null) {
        synchronized (MImageLoaderUtil.class) {
            if (instance == null) {
                instance = new MImageLoaderUtil();
            }
        }
    }
    return instance;
}

public static void load(ImageView imageView, String url) {
    ImageOptions options = new ImageOptions.Builder().setAutoRotate(true)
            .setRadius(20)
            .setFadeIn(true)
            .setAutoRotate(true)
            .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
            .setUseMemCache(true).build();
    x.image().bind(imageView, url, options);
    //x.image().clearCacheFiles();//清楚圖片緩存,

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骡楼,更是在濱河造成了極大的恐慌伪煤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笆呆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粱挡,“玉大人赠幕,你說(shuō)我怎么就攤上這事⊙ぃ” “怎么了榕堰?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嫌套。 經(jīng)常有香客問(wèn)我逆屡,道長(zhǎng),這世上最難降的妖魔是什么踱讨? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任魏蔗,我火速辦了婚禮,結(jié)果婚禮上痹筛,老公的妹妹穿的比我還像新娘莺治。我一直安慰自己,他們只是感情好帚稠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布产雹。 她就那樣靜靜地躺著,像睡著了一般翁锡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夕土,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天馆衔,我揣著相機(jī)與錄音瘟判,去河邊找鬼。 笑死角溃,一個(gè)胖子當(dāng)著我的面吹牛拷获,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播减细,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匆瓜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了未蝌?” 一聲冷哼從身側(cè)響起驮吱,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萧吠,沒想到半個(gè)月后左冬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纸型,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拇砰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狰腌。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡除破,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼腔,到底是詐尸還是另有隱情瑰枫,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布展姐,位于F島的核電站躁垛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏圾笨。R本人自食惡果不足惜教馆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擂达。 院中可真熱鬧土铺,春花似錦、人聲如沸板鬓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俭令。三九已至后德,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抄腔,已是汗流浹背瓢湃。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工理张, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绵患。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓雾叭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親落蝙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子织狐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容