学无先后,达者为师

网站首页 编程语言 正文

android okHttp网络请求封装

作者:一直向钱 更新时间: 2022-05-12 编程语言


    


    
        
            
                

                
            
        

        
            
        

    

okHttpUtil类封装

package com.nyw.okhttpjavademo.util;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;

/**
 * OkHttpClient的封装类
 */
public class OkUtils {
    private OkHttpClient okHttpClient;

    private OkUtils() {
        //日志拦截器
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)//响应时间,读取时间
                .readTimeout(20, TimeUnit.SECONDS)
                .callTimeout(20, TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)//添加日志拦截器
                .build();
    }

    //静态内部类单例模式
    public static OkUtils getInstance() {
        return OkHolder.okUtils;
    }

    static class OkHolder {
        private static final OkUtils okUtils = new OkUtils();
    }

    //这是同步的get和post
    public String getSync(String url) throws IOException {
        Request request = new Request.Builder().url(url).build();
        return okHttpClient.newCall(request).execute().body().string();
    }

    public String postSync(String url, String key, String value) throws IOException {
        RequestBody body = new FormBody.Builder().add(key, value).build();
        Request request = new Request.Builder().url(url).post(body).build();
        return okHttpClient.newCall(request).execute().body().string();
    }

    //异步的get和post

    public void getAsync(String url, Callback callback) {
        Request request = new Request.Builder().url(url).build();
        okHttpClient.newCall(request).enqueue(callback);
    }

    public void postAsync(String url, Callback callback) {
        RequestBody body = new FormBody.Builder().add("key", "value").build();
        Request request = new Request.Builder().url(url).post(body).build();
        okHttpClient.newCall(request).enqueue(callback);
    }

}

okHttp使用

package com.nyw.okhttpjavademo;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_get,btn_get_asyn,btn_post,btn_post_asyn,btn_download;

    private OkHttpClient okHttpClient;
    private Request request;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intiView();
    }

    private void intiView() {
        btn_get=findViewById(R.id.btn_get);
        btn_get_asyn=findViewById(R.id.btn_get_asyn);
        btn_post=findViewById(R.id.btn_post);
        btn_post_asyn=findViewById(R.id.btn_post_asyn);
        btn_download=findViewById(R.id.btn_download);


        btn_get.setOnClickListener(this);
        btn_get_asyn.setOnClickListener(this);
        btn_post.setOnClickListener(this);
        btn_post_asyn.setOnClickListener(this);
        btn_download.setOnClickListener(this);

        okHttpClient=new OkHttpClient();

    }

    @Override
    public void onClick(View view) {
        int id=view.getId();
        switch (id){
            case R.id.btn_get:
                //get 同步请求,同步请求必须放在线程里执行
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        request  = new Request.Builder().url("http://wwww.baidu.com").build();
                        Call call=okHttpClient.newCall(request);
                        Response response;
                        try {
                            response  = call.execute();
                            Log.i("skfjskfsnfff","execute get同步请求");
                            if (response.isSuccessful()){
                                Log.i("skfjskfsnfff","get同步请求");
                                Log.i("skfjskfsnfff",response.body().byteString().toString());
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();



            break;
            case R.id.btn_get_asyn:
                //get 异步请求
                getAsyn("http://www.baidu.com");
                break;
            case R.id.btn_post:
                //post 同步请求
                sendSynchronizationPost("http://www.baidu.com");
                break;
            case R.id.btn_post_asyn:
                //post 异步请求
                postData("http://www.baidu.com");
                break;
            case R.id.btn_download:
                //下载文件

                break;
        }
    }

    /**
     * post 同步请求,同步请求要在线程中执行
     */
    private void sendSynchronizationPost(String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //1:学什么都能new出一个对象来
                    OkHttpClient okHttpClient = new OkHttpClient();
                    //创建请求体
                    RequestBody requestBody = new FormBody.Builder()
                            .add("mobile", "18513426687")//键值对的形式
                            .build();
                    //Request就是请求的类
                    Request request = new Request.Builder().url(url).post(requestBody).build();
                    //发送请求newCall方法
                    Call call = okHttpClient.newCall(request);
                    //通过call去处理给你响应Response
                    Response response = call.execute();
                    final String string = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    /**
     * get 异步请求
     * @param url
     */
    public void getAsyn(String url) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //访问错误回调
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    //访问接口成功回调
                    String result = response.body().string();
                    Log.i("sdlfmsfklsgnfkff",result);
                    //处理UI需要切换到UI线程处理
                            activity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    isUpdate( isShow);
                                }
                            });

                }
            }
        });
    }

    /**
     * post提交表单
     */
    private void postData(String url){
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = new FormBody.Builder()
                .add("search", "Jurassic Park")
                .build();
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("fklsjlfkjsdksfjskfjs", "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("fklsjlfkjsdksfjskfjs", response.protocol() + " " +response.code() + " " + response.message());
                Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show();
                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
                    Log.d("fklsjlfkjsdksfjskfjs", headers.name(i) + ":" + headers.value(i));
                }
                Log.d("fklsjlfkjsdksfjskfjs", "onResponse: " + response.body().string());
            }
        });

    }

}


    

        

原文链接:https://blog.csdn.net/u013519290/article/details/124397061

栏目分类
最近更新