OkHttp 同步异步请求

OkHttp 安卓开发中请求图片的Demo

开启网络权限

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

gradle新增okhttp依赖

 implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.10.0'

MainActivity.java代码

package com.example.okhttpdemo;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 *  OkHttp 加载图片 异步或同步请求
 * @author cst
 */
public class MainActivity extends AppCompatActivity {
    private ImageView imageView;
    private TextView title;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        imageView = (ImageView) findViewById(R.id.image);
        title = findViewById(R.id.title);
        Button getDefaultImageBtn = findViewById(R.id.get_btn);
        Button getSynImageBtn = findViewById(R.id.get_syn_btn);
        Button getImageBtn = findViewById(R.id.image_url_btn);

        //初始化按钮单击监听器
        getDefaultImageBtn.setOnClickListener(v -> showImage("https://www.cstweb.top/wp-content/uploads/2021/09/WBVEM0EQSQEXVDIDDUJU-1-768x810.jpg"));
        getSynImageBtn.setOnClickListener(v -> showImageBySyn("https://www.cstweb.top/wp-content/uploads/2021/09/java-think-721x1024.png"));
        getImageBtn.setOnClickListener(v -> showInputDialog());
    }

    /**
     *  加载图片(异步请求)
     * @param imageURL
     */
    public void showImage(String imageURL){
        Handler handler=new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.what == 1){
                    byte[]result= (byte[]) msg.obj;
                    Bitmap bitmap=BitmapFactory.decodeByteArray(result,0,result.length);
                    imageView.setImageBitmap(bitmap);
                    title.setText("加载完成");
                }
                return false;
            }
        });

        Request request = null;
        OkHttpClient client=new OkHttpClient();
        try {
            request = new Request.Builder().url( imageURL ).build();
        } catch (IllegalArgumentException e) {
            Toast.makeText(MainActivity.this, "无效的URL地址", Toast.LENGTH_SHORT).show();
            return;
        }
        imageView.setImageDrawable(null);
        title.setText("加载中.... ");

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message message=handler.obtainMessage();
                if (response.isSuccessful()){
                    message.what=1;
                    message.obj=response.body().bytes();
                    handler.sendMessage(message);
                }else{
                    handler.sendEmptyMessage(0);
                }
            }
            @Override
            public void onFailure(Call call, IOException e) {
                runOnUiThread(() -> {
                    title.setText("加载失败...");
                    imageView.setImageDrawable(null);
                });
            }
        });
    }

    /**
     * 加载图片(同步请求)
     * @param imageURL
     */
    public void showImageBySyn(String imageURL){
        imageView.setImageDrawable(null);
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
                Request request = null;
                try {
                    request = new Request.Builder().url( imageURL ).build();
                } catch (IllegalArgumentException e) {
                    Toast.makeText(MainActivity.this, "无效的URL地址", Toast.LENGTH_SHORT).show();
                    return;
                }
                runOnUiThread(() -> title.setText("同步方式, 加载中..."));
                Call call = client.newCall(request);
                try {
                    Response response = call.execute();
                    byte[] result = response.body().bytes();
                    Bitmap bitmap=BitmapFactory.decodeByteArray(result,0,result.length);
                    runOnUiThread(() -> {
                        imageView.setImageBitmap(bitmap);
                        title.setText("加载完成");
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * URL输入对话框
     * 通过输入URL显示相应的图片
     **/
    public void showInputDialog() {
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_input_url, null, false);
        final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
        Button getImage = view.findViewById(R.id.get_image);
        Button cancelBtn = view.findViewById(R.id.cancel);
        getImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText contentText = view.findViewById(R.id.url_text);
                String URL = contentText.getText().toString().trim();
                showImage(URL);
                dialog.dismiss();
            }
        });
        cancelBtn.setOnClickListener(v -> dialog.dismiss());
        dialog.show();
    }
}

实现效果图

“OkHttp 同步异步请求”的165个回复

评论已关闭。