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();
}