使用OKHttp实现源码查看器
来源:互联网 发布:java职业规划5年计划 编辑:程序博客网 时间:2024/06/06 19:18
OKHttp的原理及源码查看器实现:
okhttp概念: 用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)
作用:减少对服务器的请求次数,减少请求延迟,减少数据流量,缓存响应数据来减少重复的网络请求,自动处理GZip压缩,客户端不管是使用 HttpClient 还是 OkHttp 都可以在请求头里加上 gzip 属性,加上该属性后会自动使用 gzip 压缩发送数据。
1. get请求
2. post请求
3. 基于Http的文件上传
4. 文件下载
5. 加载图片(内部会根据imageview的大小自动对图片进行合适的压缩。虽然不适合一次性加载大量图片的场景,但是对于app中偶尔有几个图片的加载,还是可用的)
6. 支持请求回调,直接返回对象、对象集合
7. 支持session的保持
OKhttp下载地址:https://github.com/hongyangAndroid/okhttp-utils
Android Studio的用户:
使用Studio的图形管理进行添加.(注意:okhttp有2.0版本和3.0以后的版本,这两个版本有的方法使用上有些许的不同)
Eclipse的用户:
可以下载最新的jar okhttp he latest JAR ,添加依赖就可以用了。
最新的jar地址:okio the latest JAR
注意:okhttp内部依赖okio,别忘了同时导入okio:
注意:使用网络在清单文件添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
使用:
(一)Http Get的使用步骤:
对了网络加载库,最常见的是http get请求了,比如获取一个网页的内容。
01.创建OkHttpClient对象,并设置连接超时时间(读取的可写可不写)
OkHttpClient mOkHttpClient=new OkHttpClient();注意:这种设置超时时间是OKhttp2.0特有的通过方法来进行设置
mOkHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);mOkHttpClient.setReadTimeout(10,TimeUnit.SECONDS);mOkHttpClient.setWriteTimeout(10,TimeUnit.SECONDS);
提示:设置超时时间在OKhttp3.0以后,使用build的方式进行OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10,TimeUnit.SECONDS) .writeTimeout(10,TimeUnit.SECONDS) .build();
02.通过build来创建一个Request请求,没有设置get方法,而是直接设置一个url地址,默认就是一个get方式的请求.
final Request request = new Request.Builder() .url("https://github.com/hongyangAndroid") .build();
03.创建一个call对象,参数就是Request请求对象,发送请求
Call call = mOkHttpClient.newCall(request);
04.请求加入调度
call.enqueue(new Callback() { //请求失败执行的方法 public void onFailure(Request request, IOException e){} //请求成功执行的方法,response就是从服务器得到的参数,response.body()可以得到任意类型,字符串,字节,等等. public void onResponse(final Response response) throws IOException {//这段代码可以拿到服务器的字符串.(通过response.body还可以拿到多种数据类型) //String htmlStr = response.body().string(); } });
get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然你可以通过Request.Builder设置更多的参数比如:header、method等。
然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。
最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
看到这,你会发现,整体的写法还是比较长的,所以封装肯定是要做的,不然每个请求这么写,得累死。
OKHttp注意:
onResponse回调的参数是response,一般情况下
1. 获得返回的字符串,通过response.body().string()获取;
2. 获得返回的二进制字节数组,则调用response.body().bytes();//通过二进制字节数组,可以转换为BItmap图片资源
3. 获得返回的inputStream,则调用response.body().byteStream() ;这里支持大文件下载,有inputStream我们可以通过IO的方式写文件。
不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果你希望操作控件,还是需要使用handler等
例如:public void onResponse(final Response response) throws IOException{ final String res = response.body().string(); runOnUiThread(new Runnable() { public void run() { TextView控件对象.setText(res); } });}这里是异步的方式去执行,也支持阻塞的方式,Call有一个execute()方法,你也可以直接调用call.execute()通过返回一个Response,最下面的代码就是
(二) Http Post 携带参数的使用步骤:与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传
0.0.RequestBody里所使用的上传参数的设定.(传一个字符串)
定义为成员变量:JSON:MediaType JSON = MediaType.parse("application/json; charset=utf-8");//"类型,字节码"
String json = "{\n" + "\"name\": \"hello.android6.0\"\n" + "}";//就是一个字符串. //0.0.通过post传一个文件,非常方便. MediaType FIle = MediaType.parse("application/octet-stream"); File file = new File(Environment.getExternalStorageDirectory(), "文件名.mp4");//得到一个mp4的文件,file对象
01.创建OkHttpClient对象.
OkHttpClient mOkHttpClient=new OkHttpClient(); 02.通过create,创建一个RequestBody(参数1:数据类型 参数2:字符串,文件,byte数组..) RequestBody requestBody = RequestBody.create(JSON, json); //RequestBody requestBody = RequestBody.create(FIle , file );//上传一个文件的话 03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入. Request request = new Request.Builder() .url("http://192.168.0.102:8080/TestProject/JsonServlet") .post(requestBody对象) .build();
04.创建一个call对象( 也可以省略的写为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});) Call call = mOkHttpClient.newCall(request对象); 05.请求加入调度(发送请求)call.enqueue(new Callback() { //请求失败执行的方法 public void onFailure(Request request, IOException e){} //请求成功执行的方法,response就是从服务器得到的参数 public void onResponse(final Response response) throws IOException { //String htmlStr = response.body().string(); } });通过对OKHttp的了解 ,这里我给大家最展示一个关于利用okHttp实现源码查看器:Java布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.liuy.okhtttpdemo.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="okhttp_text" android:text="查看源码"/> <!--ScrollView只能包裹已个直接的字View,否则会报错,解决办法就是放一个容器,然后容器里面有多少空间就没有关系了 --> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/text_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> </ScrollView></LinearLayout>
java代码:
import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends AppCompatActivity { private String Path = "http://192.128.3.134:8080/news.xml"; private TextView textView; private static final int SUCCEED = 993; private static final int FALL = 814; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { //加载网络成功,进行Ul的更新 case SUCCEED: //将目标文件转换字符串 String text = (String) msg.obj; textView.setText(text); break; //当加载网络失败,执行的逻辑代码 case FALL: Toast.makeText(MainActivity.this, "你太帅了,导致网路奔溃,请及时修复", Toast.LENGTH_SHORT).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //对控件进行初始化 initView(); } private void initView() { textView = (TextView) findViewById(R.id.text_tv); } /** * 通过点击事件,进行网络请求,拿到String数据 * * @param view */ public void okhttp_text(View view) { //创建okHttpclient的对象 OkHttpClient okHttpClient = new OkHttpClient(); //创建Request,Builder Request.Builder builder = new Request.Builder(); //使用Request.Builder对象,调用Url方法,传入网路路径 Request.Builder url = builder.url(Path); //使用Request.Builder对象,调用builder方法构件request对象 Request request = url.build(); //创建一个Call对象,参数就request对象 Call call = okHttpClient.newCall(request); //使用call对象,调用enqueue方法,请求加入调度(异步加载) call.enqueue(new Callback() { //当请求失败的时候,调用此方法 @Override public void onFailure(Call call, IOException e) { handler.sendEmptyMessage(FALL); } //当请求成功的时候,调用此方法 @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); //通过Handler对象,把数据传入到主线程,进行ul更新 Message obtain = Message.obtain(); //将消息放到容器里边 obtain.obj = string; //将消息告诉SUCCEED注意接收 obtain.what = SUCCEED; //发送消息 handler.sendMessage(obtain); } }); }}
注意:使用网络在清单文件添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
- 使用OKHttp实现源码查看器
- Okhttp使用和源码分析三(OkHttp源码分析)
- 《android源码分析系列》仿OkHttp-- 自己动手实现 okhttp
- Android 4.4以上使用HttpURLConnection底层使用OkHttp实现的源码分析
- OKHttp源码分析3 - HttpEngine底层实现
- Android通过微信实现第三方登录并使用OKHttp获得Token及源码下载
- 关于Okhttp(二)-如何下载查看源码
- OKHttp使用详解及源码解析
- Okhttp 框架使用和源码分析
- OKHttp使用详解及源码解析
- Glide 使用OkHttp加载图片源码分析
- 10min实现一个简易网站源码查看器(Handle的使用)
- 使用vim查看源码
- 使用eclipse查看源码
- OkHttp 3.7源码分析(二)——拦截器&一个实际网络请求的实现
- OkHttp 3.7源码分析(二)——拦截器&一个实际网络请求的实现
- okhttp拦截器的实现
- okhttp拦截器的实现
- C语言 模拟实现strcpy 与 strlen
- abap中 生产订单、销售订单、内部订单各自编号的数据字段类型
- Linux内核编程
- Spring 定时任务配置
- java命令执行jar包的方式
- 使用OKHttp实现源码查看器
- [RK3288][Android6.0] IRQ-domain.txt 翻译
- linux 部署jdk
- 【经验】使用Profiler工具分析内存占用情况
- CentOS6.4 配置iptables
- 程序员的圈子
- JAVA_SE基础——71.Random类制作随机验证码
- iOS 直播功能的实现
- Git 权限控制原理