网络处理
来源:互联网 发布:淘宝旅行机票网 编辑:程序博客网 时间:2024/06/11 18:30
2.0 okhttp
- 主页: https://github.com/square/okhttp
配置: 添加依赖
<code data-origin=""
compile 'com.squareup.okhttp3:okhttp:3.3.1'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> compile 'com.squareup.okhttp3:okhttp:3.3.1'
- <code data-origin=""
发送get请求
<code data-origin=""<code data-origin=""// get参数两种方式设置:" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> // get参数两种方式设置: // 1. 直接拼字符串: Request request = new Request.Builder() .url("http://10.0.2.2:8080/demo/query?uid=1234") .build(); // 2. 使用Uri: Uri uri = Uri.parse("http://10.0.2.2:8080/market/search") .buildUpon() .appendQueryParameter("keyword", "奶粉") .appendQueryParameter("page", "0") .appendQueryParameter("pageNum", "10") .build(); Request request = new Request.Builder() .url(uri.toString()) .build(); Response response = client.newCall(request).execute(); response.body().string(); // 读取返回数据
<code data-origin=""
<code data-origin=""2. 发送post请求<code data-origin=""<code data-origin=""<code data-origin=""RequestBody requestBody = new FormBody.Builder()" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> RequestBody requestBody = new FormBody.Builder() .add("username", "itcast") // 添加表单字段和值 .add("password", "itcast") .build(); //3.0 用FormBody.Builder, 2.0 用FormEncodingBuilder Request request = new Request.Builder() .post(requestBody) .url("http://10.0.2.2:8080/market/register") .build();
<code data-origin=""
<code data-origin=""<code data-origin=""3. 注意问题<code data-origin=""<code data-origin=""<code data-origin=""<code data-origin=""// 在Ondestroy里面取消请求:" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 在Ondestroy里面取消请求:call.cancel(); //同步请求: //直接在主线程里面发送网络请求, 会引发Exception httpClient.newCall(request).execute() //异步请求: httpClient.newCall(request).enqueue(callback)
<code data-origin=""
<code data-origin=""<code data-origin=""**4. 如果想继续使用apache库:
android {
useLibrary ‘org.apache.http.legacy’
}<code data-origin=""
<code data-origin=""<code data-origin=""2.1 Volley
<code data-origin=""
<code data-origin=""
<code data-origin=""
主页:https://android.googlesource.com/platform/frameworks/volley/
<code data-origin=""
<code data-origin=""
<code data-origin=""
特点:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
通信更快,更简单
- <code data-origin=""
<code data-origin=""
<code data-origin=""
支持网络请求的排序,优先级处理
- <code data-origin=""
<code data-origin=""
<code data-origin=""
支持网络请求的缓存
- <code data-origin=""
<code data-origin=""
<code data-origin=""
多级别的取消请求
- <code data-origin=""
<code data-origin=""
<code data-origin=""
扩展性强
- <code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用步骤:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
创建RequestQueue
- <code data-origin=""
<code data-origin=""
<code data-origin=""
创建Request
- <code data-origin=""
<code data-origin=""
<code data-origin=""
添加Request到RequestQueue
<code data-origin=""
<code data-origin=""
<code data-origin=""
request.setTag设置标签,可以用于取消请求(如果在队列里面还没有发送的话)
<code data-origin=""
<code data-origin=""
<code data-origin=""
get请求的参数需要拼接到url后面
post请求参数覆写getParams方法
header参数覆写getHeaders方法
- <code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用volley加载图片:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
实现ImageLoader
- <code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
注意事项:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
Volley仅适合用于通信频繁数据量小的网络操作
- <code data-origin=""
<code data-origin=""
<code data-origin=""
大数据量的网络操作并不适合Volley
- <code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
如何选择:
http://stackoverflow.com/questions/16902716/comparison-of-android-networking-libraries-okhttp-retrofit-volley- <code data-origin=""
<code data-origin=""
<code data-origin=""
AsyncTask的缺陷:无法取消线程的执行,使用比较麻烦
- <code data-origin=""
<code data-origin=""
<code data-origin=""
Volley = Retrofit + Picasso
- <code data-origin=""
<code data-origin=""
<code data-origin=""
Picasso很容易集成进已有的代码,Volley对已有的代码改动比较大
- <code data-origin=""
<code data-origin=""
<code data-origin=""
Picasso的性能要好一些
- <code data-origin=""
- <code data-origin=""
<code data-origin=""
<code data-origin=""
Volley在内存处理方面比Retrofit+Picasso要好一些。
<code data-origin=""
<code data-origin=""<code data-origin=""AsyncTask取消问题:
<code data-origin=""
<code data-origin=""<code data-origin=""如果的doInBackground()有不可打断的方法, cancel是不管用的
如果在doInBackground()方法中有一个循环操作,我们应该在循环中使用isCancelled()来判断:<code data-origin=""<code data-origin=""<code data-origin=""<code data-origin=""protected Object doInBackground(Object... x) {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> protected Object doInBackground(Object... x) { while (/* 循环条件 */) { if (isCancelled()) break; } return null; }
<code data-origin=""
<code data-origin=""<code data-origin=""http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully
http://stackoverflow.com/questions/6039158/android-cancel-async-task
http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/index.html
<code data-origin="" <code data-origin="" <code data-origin="" 2.2 Retrofit
<code data-origin=""2.2 Retrofit
- <code data-origin=""
<code data-origin=""
<code data-origin=""
主页: https://github.com/square/retrofit
- <code data-origin=""
<code data-origin=""
<code data-origin=""
功能:
- 效率非常高
- 可以直接将结果转换称Java类
- 主要是配合rxJava一起使用
<code data-origin=""
<code data-origin=""
<code data-origin=""
配置:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
添加Retrofit依赖: compile ‘com.squareup.retrofit2:retrofit:2.1.0’
- <code data-origin=""
<code data-origin=""
<code data-origin=""
添加数据解析依赖,根据实际情况进行选择
- Gson : com.squareup.retrofit2:converter-gson:2.1.0
- Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
- Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
- Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
- Wire : com.squareup.retrofit2:converter-wire:2.0.2
- Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
- <code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用步骤:
- <code data-origin=""
<code data-origin=""
<code data-origin=""
利用GsonFormat插件创建数据模型
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用注解设置请求参数和URl
<code data-origin=""
<code data-origin=""
<code data-origin=""
<code class="java" data-origin=""
@GET("/market/favorites")" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">@GET("/market/favorites")public Call<FavoritesResponse> getFavarites( @Header("userid")String userId, @Query("page")String page, @Query("pageNum")String pageNum);@FormUrlEncoded@POST("market/checkout")public Call<CheckOutBean> checkOut( @Header("userid")String userId, @Field("sku")String sku);
<code data-origin=""
<code data-origin=""
<code data-origin=""
<code class="java" data-origin=""
创建Retrofit对象, 并发起请求.示例代码:
<code data-origin=""
<code data-origin=""
<code data-origin=""
<code class="java" data-origin=""
<code class="java" data-origin=""
// 构建Retrofit实例" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 构建Retrofit实例Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://10.0.2.2:8080/"). .addConverterFactory(GsonConverterFactory.create()) .build();// 创建接口mService = mRetrofit.create(MainService.class);// 发送请求Call<CheckOutBean> call = mService.checkOut("20428", "1:3:1,3|2:5:1,4"); call.enqueue(new Callback<CheckOutBean>() { @Override public void onResponse( Call<CheckOutBean> call, Response<CheckOutBean> response) { CheckOutBean body = response.body(); Log.d(TAG, "onResponse: " + body); } @Override public void onFailure( Call<CheckOutBean> call, Throwable t) { Log.e(TAG, "onFailure: ", t); } });
- <code data-origin=""
<code data-origin=""<code data-origin=""<code class="java" data-origin=""<code class="java" data-origin=""
0 0
- 网络处理
- 网络信息资源地处理
- Android 网络连接处理
- J2ME网络处理
- 网络异常处理
- 网络心跳包处理
- java处理网络数据流
- Android网络超时处理
- Android网络连接处理
- webkit的网络处理
- mongodb 网络连接处理
- ffmpeg处理网络流
- Android网络连接处理
- 网络心跳包处理
- 网络环境异常处理
- IOS异步网络处理
- 网络处理Bug
- android网络处理HttpClient
- Java 代码性能优化
- 用ReetrantLock来分析java并发中不可错过的类AbstractQueuedSynchronizer
- android PackageInstaller那点事情
- python-logging
- 每日一个js实例7--通过面向对象实现选项卡
- 网络处理
- C++类成员变量初始化顺序问题
- oracle的日期函数
- 【OkHttp】封装帮助类
- 数据库处理
- UDP 调用 connect的作用--4A--个人总结
- 解决Could not find method android() for arguments问题
- Android studio 启动错误——Gradle
- 机器学习_统计学习_深度学习的一些公式