实现背景
Android应用中并不少见同一个接口需要在多个地方请求使用的情况,如果将请求直接写在相应Activity或Fragment中,那么首先可能出现的问题就是随需求变更,请求参数和返回结果都有可能变化,而修改时就需要搜索相关逻辑依次复制粘贴修改,大量重复工作且容易出错。而通过请求接口集中处理,则大大减少了工作量且减少出错机会。
注:这里请求框架以Andbase为例,其他如xutils,OKHttp,KJhttp等实现思路基本一致,不做额外介绍。
详细步骤
第一步:
在Application中初始化httputil,Context等。
package com.example;
import com.ab.http.AbHttpUtil;
import android.app.Application;
import android.content.Context;
public class App extends Application {
public static Context context;
public static AbHttpUtil http;
@Override
public void onCreate() {
super.onCreate();
context = this;
http = AbHttpUtil.getInstance(context);
}
}
第二步:
单独的requestutil类,url类(请求链接常量类),Model或Bean类(解析数据的getters&setters类),(此处除requestutil类不作展示)。
package com.example.httputil;
import org.json.JSONException;
import org.json.JSONObject;
import com.ab.http.AbRequestParams;
import com.ab.http.AbStringHttpResponseListener;
import android.util.Log;
import android.widget.Toast;
/**
*
* @ClassName: RequestUtil
* @Description: 接口请求类
* @author frank.fun@qq.com
* @date 2016年11月30日 上午08:52:32
*
*/
public class RequestUtil {
//初始化请求参数
private static AbRequestParams params;
/**回调*/
public interface CallbackListener {
//使用Object以适配所有数据类型
void result(Object t);
}
/**
*
* @Title: index
* @Description: 获取数据
* @param uid
* @param month
* @param callbackListener
* 在此处规定参数,可以清晰明了的知道接口需要什么参数,修改时也只需修改这里一处,调用处进行适当增删即可以
*/
public static void index(String uid, String month, final CallbackListener callbackListener) {
params = new AbRequestParams();
params.put("uid", uid);
params.put("month", month);
App.http.post(Url.INDEX, params, new AbStringHttpResponseListener() {
@Override
public void onFinish() {
}
@Override
public void onStart() {
}
//如果请求失败,则返回结果直接返回为null就可以,通过返回结果是否为null,就可以判定是否请求失败或者是数据解析失败,简化加载动画的实现,并防止各种类型的异常
@Override
public void onFailure(int statusCode, String content, Throwable error) {
fail(callbackListener, null);
}
//如果此处数据解析失败,则也可以直接返回为null,便于相关逻辑处理
@Override
public void onSuccess(int statusCode, String t) {
success(t);
IndexModel index = new Gson().fromJson(t, IndexModel.class);
callbackListener.result(index);
}
});
}
/**
*
* @Title: fail
* @Description: 请求失败
* @param callbackListener
* @param info提示信息
* @return null
*/
private static void fail(CallbackListener callbackListener, String info) {
callbackListener.result(null);
if (info == null) {
showToast("获取信息失败");
} else {
showToast(info);
}
}
/**
*
* @Title: success
* @Description: 请求成功
* @param content打印返回结果
*/
private static void success(String content) {
Log.d("result", content);
}
private static void showToast(String content) {
if (content != null) {
Toast.makeText(App.context, content, Toast.LENGTH_SHORT).show();
}
}
}
第三步:
Activity或Fragment中直接调用。
RequestUtil.index(uid, month, new CallbackListener() {
@Override
public void result(Object t) {
if (t != null) {
//请求成功
//请求成功相关逻辑
IndexModel index = (IndexModel) t;
name_tv.setText(index.getName());
}else{
//请求失败或其他原因导致的失败,如解析数据错误等
//请求失败相关逻辑
}
}
});