学习进度条71

第一步,需要创建一个OkHttpClient的实例,如下所示:

 

OkHttpClient client = new OkHttpClient(); // 创建一个实例

第二步,如果你想要发起一条HTTP请求,就需要创建一个Request对象:

 

//发起一条HTTP请求

Request request = new Request.Builder().build();

当然,上述代码只是创建了一个空的Request对象,并没有什么实际的作用。我们可以在最终的build()方法之前连缀很多其他方法来丰富这个Request对象。比如,可以通过url()方法来设置目标的网络地址,如下:

 

Request request = new Request.Builder()

        .url("http://www.baidu.com")

        .build();

 

 

第三步,调用OkHttpClient的newCall()方法来创建一个call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据:

 

Response response = client.newCall(request).execute();

其中,Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:

 

String responseData = response.body().string();

 

 

如果是发起一条POST,我们需要先构建出一个Request Body对象来存放待提交的 参数,如下所示:

 

RequestBody requestBody = new FormBody.Builder()

        .add("username","admin")

        .add("password","123456")

        .build();

然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入:

 

Request request = new Request.Builder()

        .url("http://baidu.com")

        .post(requestBody)

        .build();

接下来的操作就跟GET请求一样了,调用execute()方法来发送请求并获取服务器返回的数据即可。

 

 

 

接下来用一个完整的实例来演示上面的做法:

 

package com.example.webviewapplication;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.view.View;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;

import android.widget.TextView;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.ProtocolException;

import java.net.URL;

 

import okhttp3.FormBody;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.RequestBody;

import okhttp3.Response;

 

public class MainActivity extends AppCompatActivity {

   private Button send,upload;

   private TextView txt;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        send = findViewById(R.id.send_request);

        txt = findViewById(R.id.response_txt);

        upload = findViewById(R.id.upload);

 

        send.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                sendRequestWithOkHttp();

            }

        });

 

    }

 

    private void sendRequestWithOkHttp() {

        new Thread(new Runnable() {

            @Override

            public void run() {

                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()

                        .url("http://www.baidu.com")

                        .build();

                try {

                    Response response = client.newCall(request).execute();

                    String responseData = response.body().string();

                    showRequest(responseData);

                } catch (IOException e) {

                    e.printStackTrace();

                }

 

            }

        }).start();

    }

 

    private void showRequest(final String responseData) {

        runOnUiThread(new Runnable() {

            @Override

            public void run() {

                txt.setText(responseData);

            }

        });

    }

 

}

这里很重要的知识点:

 

网络请求一定要用new Thread()开线程

 

在UI界面上显示,一定要用runOnUiThread()

 

posted @ 2021-05-13 18:02  独倚高楼凭栏醉  阅读(25)  评论(0编辑  收藏  举报