zoukankan      html  css  js  c++  java
  • Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

    在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子。在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数据。因为它封装的很好了,并不需要我们去做封装,只需要写少量的代码就可以获取到复杂的网络数据了。

    一、OKhttp的最基本使用。

    还是直接使用代码来说话:

    1、添加依赖:

    Github网址:https://github.com/square/okhttp

    compile 'com.squareup.okhttp3:okhttp:3.5.0'

    2、等待构建成功后:在主活动中直接使用它的API

    1、创建布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical" >
        <Button
            android:id="@+id/send_request"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Send Request" />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
            <TextView
                android:id="@+id/response"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </ScrollView>
    </LinearLayout>

    2、主活动中的代码:

    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Button sendRequest;
        private TextView responseText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sendRequest = (Button) findViewById(R.id.send_request);
            responseText = (TextView) findViewById(R.id.response);
            sendRequest.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.send_request) {
                sendRequestWithOKHttp();
            }
        }
        private void sendRequestWithOKHttp() {
            // 开启线程来发起网络请求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        OkHttpClient client = new OkHttpClient();
                        Request request = new Request.Builder()
                                .url("http://www.baidu.com")
                                .build();
                        Response response = client.newCall(request).execute();
                        String responseData = response.body().string();
                        show(responseData);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        public void show(final String finalDatas){
            runOnUiThread(new Runnable() {
               @Override
                public void run() {
                   responseText.setText(finalDatas);
                }
            });
        }
    
    }
    

    这样我们就成功获取到了网络的数据,运行程序我们可以看到:


    二、使用OKhttp提供的接口回调

    1、定义一个HttpUtils类。加入如下静态方法:

    //使用OKhttp,OKhttp给封装好了回调,我们直接使用即可
    public static void sendOKHttpRequst(final String address, final okhttp3.Callback callback){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url(address)
                        .build();
                client.newCall(request).enqueue(callback);
            }
        }).start();
    }

    2、使用工具类,使用回调方法

    //使用OKhttp工具类
        findViewById(R.id.btn_okhttp).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HttpUtils.sendOKHttpRequst(address, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        //对异常情况处理
                        Log.e("MainActivity","错误信息是" + e.toString());
                    }
    
                    @Override
                    public void onResponse(Call call, final Response response) throws IOException {
                        //得到服务器返回的数据response
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    mTextView.setText(response.body().string());
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                });
            }
        });
    }

    这里只需要给出主活动的代码即可~,因为封装的太好,我们只需要几行代码就可以完成功能。还需要注意的是,谷歌工程师给封装业务逻辑是在子线程执行的,因此我们要更新数据要在主线程执行。运行程序接口是一样的~


    喜欢我的朋友可以关注我,本专栏不定期更新简单有趣的安卓小文~

    对于OKHttp更高级的用法,以后会在Android Studio精彩案例专栏里面进行细致详细的分析



  • 相关阅读:
    webpack4.x下babel的安装、配置及使用
    SQL Server中追踪器Trace的介绍和简单使用
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299475.html
Copyright © 2011-2022 走看看