android请求接口一般是短连接的http请求方式
一个完整框架需要具备有同步和异步,get post方式,图片,流文件等上传的功能,即对外要暴露这些接口。那么在代码设计时需要考虑到封装好这些方法。
查看这个接口类
/**
* 网络请求工具接口
* @author zhousf
*/
public interface OkHttpUtilInterface {
/**
* 同步请求
* @param info 请求信息体
* @return HttpInfo
*/
HttpInfo doSync(HttpInfo info);
/**
* 异步请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
void doAsync(HttpInfo info, BaseCallback callback);
/**
* 同步Post请求
* @param info 请求信息体
* @return HttpInfo
*/
HttpInfo doPostSync(HttpInfo info);
/**
* 同步Post请求
* @param info 请求信息体
* @param callback 进度回调接口
* @return HttpInfo
*/
HttpInfo doPostSync(HttpInfo info, ProgressCallback callback);
/**
* 异步Post请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
void doPostAsync(HttpInfo info, BaseCallback callback);
/**
* 异步Post请求
* @param info 请求信息体
* @param callback 进度回调接口
*/
void doPostAsync(HttpInfo info, ProgressCallback callback);
/**
* 同步Get请求
* @param info 请求信息体
*/
HttpInfo doGetSync(HttpInfo info);
/**
* 异步Get请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
void doGetAsync(HttpInfo info, BaseCallback callback);
/**
* 异步上传文件
* @param info 请求信息体
*/
void doUploadFileAsync(final HttpInfo info);
/**
* 批量异步上传文件
* @param info 请求信息体
* @param callback 进度回调接口
*/
void doUploadFileAsync(final HttpInfo info, ProgressCallback callback);
/**
* 同步上传文件
* @param info 请求信息体
*/
void doUploadFileSync(final HttpInfo info);
/**
* 批量同步上传文件
* @param info 请求信息体
* @param callback 进度回调接口
*/
void doUploadFileSync(final HttpInfo info, ProgressCallback callback);
/**
* 异步下载文件
* @param info 请求信息体
*/
void doDownloadFileAsync(final HttpInfo info);
/**
* 同步下载文件
* @param info 请求信息体
*/
void doDownloadFileSync(final HttpInfo info);
/**
* 同步Delete请求
* @param info 请求信息体
* @return HttpInfo
*/
HttpInfo doDeleteSync(HttpInfo info);
/**
* 异步Delete请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
void doDeleteAsync(HttpInfo info, BaseCallback callback);
/**
* 同步Put请求
* @param info 请求信息体
* @return HttpInfo
*/
HttpInfo doPutSync(HttpInfo info);
/**
* 异步PUT请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
void doPutAsync(HttpInfo info, BaseCallback callback);
/**
* 取消请求
* @param requestTag 请求标识
*/
void cancelRequest(Object requestTag);
/**
* 获取默认的HttpClient
*/
OkHttpClient getDefaultClient();
/**
* 清理缓存:只清理网络请求的缓存,不清理下载文件
*/
boolean deleteCache();
}
发现除了刚才提到的,还有下载文件,put delete的请求方式。在具体情形在看他们的差异。
public class OkHttpUtil implements OkHttpUtilInterface{
/**
* 同步请求
* @param info 请求信息体
* @return HttpInfo
*/
@Override
public HttpInfo doSync(HttpInfo info) {
return OkHttpHelper.Builder()
.httpInfo(info)
.requestType(info.getRequestType())
.helperInfo(packageHelperInfo(info))
.build()
.doRequestSync();
}
/**
* 异步请求
* @param info 请求信息体
* @param callback 结果回调接口
*/
@Override
public void doAsync(final HttpInfo info, final BaseCallback callback) {
executorService.schedule(new Runnable() {
@Override
public void run() {
OkHttpHelper.Builder()
.httpInfo(info)
.requestType(info.getRequestType())
.callback(callback)
.helperInfo(packageHelperInfo(info))
.build()
.doRequestAsync();
}
},info.getDelayExecTime(),info.getDelayExecUnit());
}
/**
* 批量异步上传文件
* @param info 请求信息体
*/
@Override
public void doUploadFileAsync(final HttpInfo info, final ProgressCallback callback){
final List<UploadFileInfo> uploadFiles = info.getUploadFiles();
executorService.schedule(new Runnable() {
@Override
public void run() {
OkHttpHelper.Builder()
.httpInfo(info)
.uploadFileInfoList(uploadFiles)
.requestType(RequestType.POST)
.progressCallback(callback)
.helperInfo(packageHelperInfo(info))
.build()
.uploadFile();
}
},info.getDelayExecTime(),info.getDelayExecUnit());
}
}
这里面异步的话就是把当前进行的任务由ScheduledExecutorService来调度
ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务的状态。
了解了基本流后在看具体的细节。
此外,如果想在自定义的四大组件之外的类中,拿到Application类可以通过反射机制。
private OkApplication(){
Object activityThread;
try {
Class acThreadClass = Class.forName("android.app.ActivityThread");
if(acThreadClass == null)
return;
Method acThreadMethod = acThreadClass.getMethod("currentActivityThread");
if(acThreadMethod == null){
return;
}
acThreadMethod.setAccessible(true);
activityThread = acThreadMethod.invoke(null);
Method applicationMethod = activityThread.getClass().getMethod("getApplication");
if(applicationMethod == null){
return;
}
Object app = applicationMethod.invoke(activityThread);
application = (Application) app;
} catch (Throwable e){
e.printStackTrace();
}