Android 开发之异步网络请求(AsyncHttp开发)

我们在Android开发中,经常会用到Http进行请求数据.首先,在java中用的Http分为Httpclient和Httpconnection,在net中经常用ajax去请求数据,基本都是用了回调的机制。

今天,我要讲的是利用Async http client 这套框架如何去请求数据。

我用的是as开发,毕竟Google也是推荐使用它,eclipse使用起来也没那么方便。

那么我们快进入正题吧!

如何配置这套框架?

第一步:在应用程序的build.gradle里进行引用框架

    compile 'com.loopj.android:android-async-http:1.4.6'
  (注:上面是最简单的配置方法,我们还可以通过下载jar包,然后点击菜单栏>file>Project Structure>app>denpendence>点击"+"号,选择library 把项目的jar包加入,这样也是一种引用jar包的方式。在eclipse里是点击build path来依赖jar包,和开发j2ee是一样用的)

这时,我们已经把jar引用进来了,也就是我们可以使用别人的方法就可以使用啦!但是如果就这么结束了,是不是欠妥?在要请求了,总是一味的无脑调方法,是否考虑到代码的简洁,后期的维护性,方便后来维护的人看代码?

第二步:我们可以点击进入jar包查看源码
首先,我们可以想一想,在我们日常的http请求中主要就分为那几种请求方式:post(),put(),get(),还有关于文件的上传和下载。哦!原来是有这么多的请求方式在里面。那我就ctrl+f去搜索一下当前的class中的这些方法。这些请求方法普遍都用到了RequstHandle打头定义的方法和内部的ResponseHandlerInterface接口。这里的意思就是说我们在源码里看到的RequestHandle是怎么用得?我们用客户端发送一个请求给服务端,Request到RequestHandle再调用内部接口去实现返回json数据,ResponseHandleInterface里面又有onSuccess和OnFaliure方法。这里我们看到了重点,是什么?也是我很有收获的地方就是自定义回调的接口然后在宿主中实现,达到了回调的机制。因此,我们也可以模仿着写写,就是类似于我在做net mvc开发的时候用的controller一样,起到一个控制的作用。在用的时候,传对应的参数过去,直接调用jar中的方法。这样不就极大的减少了代码量,也能快速的开发啦,如果加上自定义的注解那是更快!!!

废话不多说我们先自定义两个接口,代码如下:

用于普通的

public interface <span style="color:#ff0000;">ApiCallBack</span> {
	public void onSuccess(int statusCode, Header[] headers, byte[] response);

	public void onFailure(int statusCode, Header[] headers,
						  byte[] responseBody, Throwable error) throws JSONException;
}
用于文件的

public interface <span style="color:#ff0000;">ApiFileUploadCallBack</span> {
	public void onSuccess(int statusCode, Header[] headers, File file);
	public void onFailure(int statusCode, Header[] headers, Throwable error, File file);
}
接着我们自定义一个类去把这些get(),post(),put(),uploadFile()方法放进去,这个自定义类里就是用于请求的,其中把header头信息的方法,超时方法都放进去,这样就有利于后期的维护和开发。代码如下:

public class <span style="color:#ff0000;">CustomHttpClient</span> {

    AsyncHttpClient client = new AsyncHttpClient();

    public CustomHttpClient() {
        super();

    }

    public CustomHttpClient(AsyncHttpClient client) {
        super();
        this.client = client;
        settingClientHeader();
    }

    public void setTimeOut() {
        client.setTimeout(6000000);
    }

    public void addheader(String key, String value) {
        client.addHeader(key, value);
    }

    private void settingClientHeader() {
        client.addHeader("Content-Type", "application/json;charset=utf-8");
        client.addHeader("Accept-Language", "zh-cn,zh;q=0.5");
    }

    public void cancleHttpRequest() {
        client.cancelAllRequests(true);
    }

    public RequestHandle doGet(String url, final ApiCallBack callBack) {
        return client.get(url, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                callBack.onSuccess(statusCode, headers, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    callBack.onFaliure(statusCode, headers, responseBody, error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public RequestHandle doPost(String url, RequestParams params, final ApiCallBack callBack) {
        return client.post(url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                callBack.onSuccess(statusCode, headers, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    callBack.onFaliure(statusCode, headers, responseBody, error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public RequestHandle doEntityPost(Context context, String url, HttpEntity entity, String contentType, final ApiCallBack callBack) {
        return client.post(context, url, entity, contentType, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                callBack.onSuccess(statusCode, headers, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    callBack.onFaliure(statusCode, headers, responseBody, error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public RequestHandle doDelete(String url, final ApiCallBack callBack) {
        return client.delete(url, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                callBack.onSuccess(statusCode, headers, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    callBack.onFaliure(statusCode, headers, responseBody, error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public RequestHandle doPut(String url, RequestParams params, final ApiCallBack callBack) {
        return client.put(url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                callBack.onSuccess(statusCode, headers, responseBody);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                try {
                    callBack.onFaliure(statusCode, headers, responseBody, error);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public RequestHandle UpLoadFile(Context context, String url, RequestParams params, final ApiFileUploadCallBack fileCallBack) {
        return client.post(url, new FileAsyncHttpResponseHandler(context) {
            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable error, File file) {
                fileCallBack.onFailure(statusCode, headers, error, file);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, File file) {
                fileCallBack.onSuccess(statusCode, headers, file);
            }

            @Override
            public boolean deleteTargetFile() {
                return super.deleteTargetFile();
            }

            @Override
            protected File getTargetFile() {
                return super.getTargetFile();
            }
        });

    }
}

其中的callback.onSuccess()等方法就实现了回调机制。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaScript中,异步请求通常使用async和await关键字来处理。async函数相当于生成器的语法糖,而await关键字用于暂停代码的执行,以等待异步操作的完成。以下是使用async和await处理异步请求的几种常见方式: 1. 单个异步请求:使用Promise。 例如:`async function fetchData() { const response = await fetch('url'); const data = await response.json(); return data; }` 2. 多个并行的异步请求:使用Promise.all或Promise.race。 例如:`async function fetchMultipleData() { const promises = [fetch('url1'), fetch('url2'), fetch('url3')]; const responses = await Promise.all(promises); const data = responses.map(response => response.json()); return data; }` 3. 多个串行的异步请求:使用async和await的链式操作。 例如: ``` async function fetchSequentialData() { const response1 = await fetch('url1'); const data1 = await response1.json(); const response2 = await fetch('url2'); const data2 = await response2.json(); return [data1, data2]; } ``` 总结来说,使用async和await可以简化异步请求的处理,使代码看起来更加同步和易于理解。您可以根据具体的需求选择合适的方式来处理异步请求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [深入浅出JS—21 异步代码处理方案之async-await](https://blog.csdn.net/qq_36154157/article/details/124838720)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [JS异步编程(async、await详解)](https://blog.csdn.net/weixin_46240162/article/details/113531714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值