okHttp3.0获取网络数据

来源:互联网 发布:淘宝货源免费代理代销 编辑:程序博客网 时间:2024/06/05 19:10

                                   okHttp3.0获取网络数据

   听到okHttp以后首先查了一下goole浏览器等等(关于它的相关信息)还是根据了一个大牛(hongYang)的一些相关文档

根据他的文档进行一步步的做就完成了;(是不是感觉很简单,下面我们就来具体的说一下我的步骤吧!)

    okHttp获取网络数据分为简单获取和封装获取:

    简单获取:就是直接get,post

    get请求数据:首先是定义一个方法:在方法中进行(1)创建一个request请求对象进行将url赋值如下所示:

// 创建一个request对象Request request = new Request.Builder()        .url(url)        .build();

创建一个okHttpClient对象,通过它调用newCall(request请求对象).enqueue(接口回调)等等方法在接口回调的方法中进行获取数据并进行发送handler消息进行更新UI数据的操作 如下所示

Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {    @Override    public void onFailure(Request request, IOException e) {    }    @Override    public void onResponse(Response response) throws IOException {        String s = response.body().string();        Log.e("============", s+"");        // 解析数据        list = initGson(s);        Message message2 = Message.obtain(handler,0,list);        message2.sendToTarget();    }});

此方法的获取数据方式比较麻烦因为需要用到子线程与handler发送消息等等


切记:此方法中okHttp本身没有进行子线程和主线程的操作所以此时需要我们自己手动的交互 如下所示:

// 初始化数据new Thread(new Runnable() {    @Override    public void run() {        /**         * 因为请求数据的时候 需要进行耗时操作         * 所以此时就要用到了子线程的请求         * handler一起用到         */        try {            initData();        } catch (Exception e) {            e.printStackTrace();        }    }}).start();
Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what){            case 0:                List<JsonBean.TrailersBean> list = (List<JsonBean.TrailersBean>) msg.obj;                for(int i=0;i<list.size();i++){                    String movieName = list.get(i).getMovieName();                    Log.e("=====name===",movieName);                }                // 进行适配器                initAdapter(list);                break;        }    }};


紧接着进行post的发送方法

Request request = buildMultipartFormRequest(url,new File[]{file}, new String[]{fileKey}, null);

FormEncodingBuilder builder =new FormEncodingBuilder();  

builder.add("username","张鸿洋");Request request = new Request.Builder() 

.url(url)  

.post(builder.build())  

.build(); 

mOkHttpClient.newCall(request).enqueue(new Callback(){});


上面的操作就是我按照(hongYang)博客中进行的操作 其实post请求就是请求对象那有一些不同与get请求

下面的操作就和get请求都一样了


下面咱们就来看一下封装后的OkHTTP网络请求

首先我们应该先要弄清楚我们为什么要做这项工作?(上面的okHttp请求数据操作已经看到了是不是感觉比较麻烦还需要定义子线程和handler的消息交互等等)而我们现在要做的就是不需要自己定义子线程和Handler的操作让后台直接完成好之后我们直接调用他

现在让我们来进行一下具体操作:

第一,我们可以自己封装一个依赖库(或者你可以下载一个开源的依赖库我是直接下载别人的依赖库大家可以随意)

第二,导入别人的依赖库肯定会有错误(有可能会报API版本的错误或者会报

PersistentCookieJar:v0.9.3的错误
)

此时就需要进行查询方法:我在gittub网站上搜索

PersistentCookieJar的用法 通过人家的用法 进行一步步修改

Step 1. Add the JitPack repository in your root build.gradle at the end of repositories:

allprojects {    repositories {        maven { url "https://jitpack.io" }    }}
切记不要忘记添加到app中的moudle依赖库

在glide文件中将无用的方法注销掉 等等 我遇到的错误就这么多 如果还有的话希望大家再根据不同的错误寻找不同的解决方法


  以上是我们导入依赖库所遇到的一系列问题 及解决方法  接下来我们就开始在代码中的实现了

首先现在在进行网络的请求所以切记不要忘记加网络权限 

    代码块 :第一步 首先来get封装的获取数据如下所示

String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";OkHttpUtils        .get()        .url(url)        .id(100)        .build()        .execute(new MyStringCallback());


   从方法中不难看出他是根据OKHttpUtils工具类进行的操作 请求方式 路径 id build execute(自定义接口回调)

如下所示

public class MyStringCallback extends StringCallback    {        @Override        public void onBefore(Request request, int id)        {            setTitle("loading...");        }        @Override        public void onAfter(int id)        {            setTitle("Sample-okHttp");        }        @Override        public void onError(Call call, Exception e, int id)        {            e.printStackTrace();            tv_01.setText("onError:" + e.getMessage());        }        @Override        public void onResponse(String response, int id)        {            Log.e(TAG, "onResponsecomplete");            tv_01.setText("onResponse:" + response);            switch (id)            {                case 100:                    Toast.makeText(FengActivity.this, "http", Toast.LENGTH_SHORT).show();                    break;                case 101:                    Toast.makeText(FengActivity.this, "https", Toast.LENGTH_SHORT).show();                    break;            }        }        @Override        public void inProgress(float progress, long total, int id)        {            Log.e(TAG, "inProgress:" + progress);//            mProgressBar.setProgress((int) (100 * progress));        }    }

大家可以直接复制粘贴就行了 

在此接口中不难发现 首先它是实现了一个stringCallBack接口 重写了它里面的一系列方法 在此方法中进行了一系列的操作  在这个接口中还对http https 进行了判断 大家可以根据不同的需求 进行不同的操作







还有一个post请求 我们现在就不解释太多了 因为post方法和get方法中没有什么不同 无非就是请求方式为post而已

接下来我们就看一下具体代码的实现吧

public void postDataOkHttp()    {        String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";//        url="http://www.391k.com/api/xapi.ashx/info.json?key=bd_hyrzjjfb4modhj&size=10&page=1";        url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";        OkHttpUtils                .post()                .url(url)                .id(100)                .build()                .execute(new MyStringCallback());    }
接口还是get方法中的接口所以大家直接可以复制过来就行了 在这里我们就不多说了


       以上就是我们的okHttp的网络请求 它还可以进行上传文件和下载文件等等方法 我们下次再细细说明

0 0
原创粉丝点击