上步驟:
1, 添加依賴
2,在application中初始化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();//清楚圖片緩存,
}
}