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