使用OkHttp访问网络

本文介绍了如何使用OkHttp进行网络通信,相较于HttpURLConnection,OkHttp更简单易用。首先需要在项目中导入OkHttp和Okio的依赖,然后创建OkHttpClient实例,接着创建Request对象并指定目标地址,通过OkHttpClient调用execute()发送请求并获取数据。示例代码展示了GET和POST请求的使用方法,简化了网络访问的过程。

使用网络通信库我们不仅限于使用原生的HttpURLConnection,除了这个还有其他的也是非常好用的,就比如说OkHttp,使用过之后感觉比原生的HttpURLConnection还要简单易用,下面我们就来学习一下。

要使用OkHttp首先要导入依赖,要导入依赖我们要先去OkHttp的项目主页地址看一下他现在的版本号,和一些要注意的事项。

项目主页地址:https://github.com/square/okhttp

需要注意的就是下面的这个,OkHttp需要运行在Android5.0和Java 8+上。

添加完依赖,会自动下载两个库,一个是OkHttp库,另一个是Okio库。后者是前者的通信基础。

然后下面是具体使用方法:

  1. 首先要创建一个OkHttpClient的实例。
  2. 发起HTTP请求,需要创建一个Request对象,然后在这个对象中添加你想要添加的比如目标地址等。
  3. 然后调用OkHttpClient的newCall()方法来创建一个对象,并调用它的execute()方法来发送请求并获取服务器返回的数据。

基本就是这些,感觉要比HttpURLConnection简单好多。

下面我们来看一下运行结果:

 

可以看出,这种方法和用HttpURLConnection的方法运行效果是一样的。但是使用起来比较简单。

先添加网络访问权限:

    <uses-permission android:name="android.permission.INTERNET"/>

然后修改app/build.gradle文件,在dependencies闭包中添加:

implementation("com.squareup.okhttp3:okhttp:3.14.0")        

 

下面我们来看一下代码:

activity_main.xml代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
 
 <Button
     android:id="@+id/send_request"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/but_1"/>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/response_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>
 
</LinearLayout>

布局代码并没有改变。

MainActivity中的代码如下:

public class MainActivity extends AppCompatActivity {
TextView responseText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.send_request);
        responseText = findViewById(R.id.response_text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendRequestWithOkHttp();
            }
        });
    }

    private void sendRequestWithOkHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
               try{
                   OkHttpClient client = new OkHttpClient();    //创建OkHClient实例
                   Request request = new Request.Builder()     //发请求创建一个Request对象
                           .url("http:www.baidu.com")
                           .build();
                   Response response = client.newCall(request).execute();  //发请求获取服务器返回的数据
                   String responseData = response.body().string();
                   showResponse(responseData);

               } catch (Exception e){
                   e.printStackTrace();
               }
            }
        }).start();
    }

    private void showResponse(final String responseData) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {           //开线程显示数据
                responseText.setText(responseData);
            }
        });
    }
}

这样就完成了。

下面我们总结一下OkHttp获取请求和提交请求的使用方法:

OkHttp中GET请求的使用:

public void getRequest(Context context, String requestUrl) {
        mContext = context;
        try {
            //得到OkHttpClient对象
            OkHttpClient mOkHttpClient = new OkHttpClient();
            //构造Request对象
            Request.Builder builder = new Request.Builder();
            Request request = builder.get().url(requestUrl).build();
            //将Request封装为Call
            Call mCall = mOkHttpClient.newCall(request);
            //开始执行Call
            //Response mResponse= mCall.execute();//同步方法
            mCall.enqueue(new Callback() {//异步执行方法
                @Override
                public void onFailure(Call call, IOException e) {
 
                }
 
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    int code = response.code();//响应码
                    String result = response.body().string();
                    Message message = new Message();
                    message.what = MSG_GETSTATE;
                    message.obj = code;
                    mHandler.sendMessage(message);
                }
            });
        } catch (Exception e) {
 
        }
    }

OKHttp的POST请求的使用:

public void postRequest(String requestUrl, JSONObject mJsonObject) {
        try {
            //初始化OkHttpClient
            OkHttpClient mOkHttpClient = new OkHttpClient();
            //构造Json的请求对象
            RequestBody mRequestBody = RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"), mJsonObject.toString());
            //构造Request对象
            Request.Builder mBuilder=new Request.Builder();
            Request request=mBuilder.post(mRequestBody).url(requestUrl).build();
            //构造Call对象
            Call mCall=mOkHttpClient.newCall(request);
            mCall.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
 
                }
 
                @Override
                public void onResponse(Call call, Response response) throws IOException {
 
                }
            });
        } catch (Exception e) {
 
        }
    }

使用OkHttp的GET和POST都可以按照上边的用法套。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值