前言:
移动端开发工程师数目庞大,移动开发中网络访问是必不可少的环节;支持安卓访问网络的框架有很多。okhttp 也是现在比较常用的框架,它的封装性比较强,也支持多中参数结构的访问。
今天主要说两个点 :1,,okhttp的使用 (Android studio中)
2,分享本人一直在用的封装文件。
一,
android studio中的使用:
注:如果您使用的eclipse 或者 无法获取 google提供的库 可以选择下载 jar包导入使用 效果一样。
下载地址:https://download.youkuaiyun.com/download/qq_36355271/10819313
https://download.youkuaiyun.com/download/qq_36355271/10819240
首先 as 在使用okhttp 的第一步 导入工具库:
如下图 导入
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
然后编译完成后即可
然后是我的 网络请求时的使用:
下面方法是 get 方法的实例;
public OkHttpHelper okHttpHelper=new OkHttpHelper();
public void Http_(){
String url= Sapo_Http.http_url+Sapo_Http.Login;
okHttpHelper.get(url, null, new SpotsCallBack(context) {
@Override
public void onSuccess(Response response, Object o) {
try { //请求成功
JSONObject jb=new JSONObject(o.toString());
if(jb.getInt("code")==0){
UserTable ub=new UserTable();
ub.setNames(jb.getString("username"));
ub.setOrganCode(jb.getString("OrganCode"));
ub.setIds(jb.getString("UserId"));
ub.setPassword(password.getText().toString().trim());
if(ub.save()){
Intent in=new Intent(context,MainActivity.class);
startActivity(in);
finish();
}else {
Toast.makeText(context,"保存失败",Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(context,jb.getString("msg"),Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(Response response, int code, Exception e) {
super.onError(response, code, e); //请求失败回调
Toast.makeText(context,"请检查网络",Toast.LENGTH_SHORT).show();
}
});
二,然后是这个方法用到的依赖工具文件:
1,加载进度+异步监听 文件
public abstract class SpotsCallBack<T> extends BaseCallback<T> {
private Context mContext;
private SpotsDialog mDialog;
public SpotsCallBack(Context context){
mContext = context;
initSpotsDialog();
}
private void initSpotsDialog(){
mDialog = new SpotsDialog(mContext,"拼命加载中...");
}
public void showDialog(){
mDialog.show();
}
public void dismissDialog(){
mDialog.dismiss();
}
public void setLoadMessage(int resId){
mDialog.setMessage(mContext.getString(resId));
}
@Override
public void onError(Response response, int code, Exception e) {
dismissDialog();
}
@Override
public void onFailure(Request request, Exception e) {
dismissDialog();
}
@Override
public void onBeforeRequest(Request request) {
showDialog();
}
@Override
public void onResponse(Response response) {
dismissDialog();
}
}
2,okhttp 封装文件 :
包括 get post,postjson postfiles等 直接调用传入相关参数即可:
public class OkHttpHelper {
public static final String TAG = "OkHttpHelper";
private static OkHttpHelper mInstance;//单例模式
private OkHttpClient mHttpClient;
private Gson mGson;
public static final MediaType JSON_ = MediaType.parse("application/json; charset=utf-8");
private Handler mHandler;
static {
mInstance = new OkHttpHelper();
}
public OkHttpHelper(){
mHttpClient = new OkHttpClient();
//设置几个超时时间
mHttpClient = new OkHttpClient.Builder()//构建器
.connectTimeout(1000, TimeUnit.SECONDS)//连接超时
.writeTimeout(1000, TimeUnit.SECONDS)//写入超时
.readTimeout(1000, TimeUnit.SECONDS)//读取超时
.build();
mGson = new Gson();
mHandler = new Handler(Looper.getMainLooper());
}
;
/**
* @return 唯一的OkHttpHelper对象
*/
public static OkHttpHelper getInstance() {
return mInstance;
}
/**
* @param url url
* @param callback 自定义的callback
*/
public void get(String url, String hander, BaseCallback callback) {
Request request = buildGetRequest(url, hander);
request(request, callback);
}
/**
* @param url 请求的url地址
* @param param 封装的参数
* @param callback 自定义的callback
*/
public void post(String url, String hander, Map<String, String> param, BaseCallback callback) {
Request request = buildPostRequest(url, hander, param);
request(request, callback);
}
public void postJson(String url, String hander, String paramJson, BaseCallback callback) {
Request request = buildPostRequestJson(url, hander, paramJson);
request(request, callback);
}
/**
* 请求网络
*
* @param request
* @param callback
*/
public void request(final Request request, final BaseCallback callback) {
callback.onBeforeRequest(request);
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onFailure(request, e);
if (request.body() == null) {
callbackError(callback, null, 404, null);
// callback.onError(null,404,new Exception());
} else {
callbackError(callback, null, 404, null);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callback.onResponse(response);
if (response.isSuccessful()) {
String resultStr = response.body().string();
Log.d(TAG, "result=" + resultStr);
if (callback.mType == String.class) {
callbackSuccess(callback, response, resultStr);
} else {
try {
// Object obj = mGson.fromJson(resultStr, callback.mType);
callbackSuccess(callback, response, resultStr);
} catch (JsonParseException e) { // Json解析的错误
callback.onError(response, -1, e);
}
}
} else {
//callback.onError(response,response.code(),new Exception());
callbackError(callback, response, -1, null);
}
}
});
}
public static String getFilePath(final Context context, final Uri uri ) {
if ( null == uri ) return null;
final String scheme = uri.getScheme();
String data = null;
if ( scheme == null )
data = uri.getPath();
else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
data = uri.getPath();
} else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
if ( null != cursor ) {
if ( cursor.moveToFirst() ) {
int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
if ( index > -1 ) {
data = cursor.getString( index );
}
}
cursor.close();
}
}
return data;
}
public void post_upLoadFileduo(Context context, String url, List<pic> list_pic, BaseCallback callback) {
// Request request = buildPostRequestJson(url,hander,paramJson);
// request(request,callback);
upLoadFile(context,url, list_pic, callback);
}
public void post_upLoadFile(Context context,String url, String filename, BaseCallback callback) {
// Request request = buildPostRequestJson(url,hander,paramJson);
// request(request,callback);
upLoadFileduo(context,url, filename, callback);
}
private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");//mdiatype 这个需要和服务端保持一致
/**
* 上传文件
*
* @param actionUrl 接口地址
*/
public <T> void upLoadFile(Context context,String actionUrl, List<pic> list_pic, final BaseCallback<T> callBack) {
callBack.onBeforeRequest(null);
String requestUrl = actionUrl;
//创建File
//创建RequestBody
// RequestBody body = RequestBody.create(MEDIA_TYPE_MARKDOWN, file);
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
//builder.addFormDataPart("1",file);
for (int i=0;i<list_pic.size()-1;i++){
if(list_pic.get(i).getType1()==1) {
// File file = new File(list_pic.get(i).getUill());
File file = CompressHelper.getDefault(context).compressToFile(new File(list_pic.get(i).getUill()));
builder.addFormDataPart("file", file.getName(), RequestBody.create
(MediaType.parse("application/octet-stream"), file));
}
}
//文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,s
//构建
MultipartBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(requestUrl).post(body).build();
final Call call = mHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onFailure(null, e);
callbackError(callBack, null, -1, null);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callBack.onResponse(response);
if (response.isSuccessful()) {
String string = response.body().string();
Log.e(TAG, "response ----->" + string);
callbackSuccess(callBack, response, string);
} else {
// failedCallBack("上传失败", callBack);
callbackError(callBack, response, -1, null);
}
}
});
}
/**
* 上传文件
*
* @param actionUrl 接口地址
*/
public <T> void upLoadFileduo(Context context,String actionUrl, String filename, final BaseCallback<T> callBack) {
callBack.onBeforeRequest(null);
String requestUrl = actionUrl;
//创建File
File file = CompressHelper.getDefault(context).compressToFile(new File(filename));
//创建RequestBody
// RequestBody body = RequestBody.create(MEDIA_TYPE_MARKDOWN, file);
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
//builder.addFormDataPart("1",file);
//文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,
//此处应该改变
builder.addFormDataPart("file",file.getName(),RequestBody.create
(MediaType.parse("application/octet-stream"),file));
//构建
MultipartBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(requestUrl).post(body).build();
final Call call = mHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onFailure(null, e);
callbackError(callBack, null, -1, null);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callBack.onResponse(response);
if (response.isSuccessful()) {
String string = response.body().string();
Log.e(TAG, "response ----->" + string);
callbackSuccess(callBack, response, string);
} else {
// failedCallBack("上传失败", callBack);
callbackError(callBack, response, -1, null);
}
}
});
}
private void callbackSuccess(final BaseCallback callback, final Response response, final Object obj) {
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(response, obj);
}
});
}
private void callbackError(final BaseCallback callback, final Response response, final int code, final Exception e) {
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onError(response, code, e);
}
});
}
private Request buildPostRequest(String url, String hander, Map<String, String> params) {
return buildRequest(url, HttpMethodType.POST, hander, params, null);
}
private Request buildPostRequestJson(String url, String hander, String paramsJson) {
return buildRequest(url, HttpMethodType.POST, hander, null, paramsJson);
}
private Request buildGetRequest(String url, String hander) {
return buildRequest(url, HttpMethodType.GET, hander, null, null);
}
private Request buildRequest(String url, HttpMethodType methodType, String hander, Map<String, String> params, String paramsJson) {
Request.Builder builder = new Request.Builder()
.url(url);
if (hander != null) {
builder.addHeader("Authorization", hander)
.addHeader("Content-Type", "application/json");
} else {
builder.addHeader("Content-Type", "application/json");
}
if (methodType == HttpMethodType.POST) {
RequestBody body = null;
if (paramsJson != null) {
body = RequestBody.create(JSON_, paramsJson);
} else {
body = builderFormData(params);
}
builder.post(body);
} else if (methodType == HttpMethodType.GET) {
builder.get();
}
return builder.build();
}
private RequestBody builderFormData(Map<String, String> params) {
MultipartBody.Builder builder = new MultipartBody.Builder();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addFormDataPart(entry.getKey(), entry.getValue());
}
}
return builder.build();
}
enum HttpMethodType {
GET,
POST,
}
}
3 ,访问异步监听文件 :(进度条+监听 SpotsCallBack 继承此文件)
public abstract class BaseCallback <T> {
public Type mType;
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class)
{
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public BaseCallback()
{
// mType = getSuperclassTypeParameter(getClass());
}
public abstract void onBeforeRequest(Request request);
public abstract void onFailure(Request request, Exception e) ;
/**
*请求成功时调用此方法
* @param response
*/
public abstract void onResponse(Response response);
/**
*
* 状态码大于200,小于300 时调用此方法
* @param response
* @param t
* @throws IOException
*/
public abstract void onSuccess(Response response,T t) ;
/**
* 状态码400,404,403,500等时调用此方法
* @param response
* @param code
* @param e
*/
public abstract void onError(Response response, int code,Exception e) ;
}
以上为我常用的安卓 okhttp 封装,使用非常简单,也有注册可读性较强 ,
希望对小伙伴有帮助,,个人开发笔记 ,,若有错误 欢迎留言评论。
转载请标明出处