Android 網絡框架學習一(必備的功能)

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();
        }
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章