okHttpClient上传下载

首先添加一个依赖:
mplementation 'com.squareup.okhttp3:okhttp:3.11.0'

然后添加权限  网络、读写、

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
布局:就两个按钮,一个图片

<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_upload"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="上传图片" />
        <Button
            android:id="@+id/btn_load"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="下载图片" />
    </LinearLayout>


    <ImageView
        android:id="@+id/img_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>

逻辑---Activity

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

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

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public static final String PATH = "https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/";
    public static final String URL = "https://www.718shop.com/sell/sell.m.picture.upload.do";
    private Button btn_upload;
    private Button btn_load;
    private ImageView img_view;
    public static final int FALL = 123;
    public static final int SUCCESS = 100;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case SUCCESS: //加载网络成功,进行UI的更新,处理得到的图片资源
                    byte[] obj = (byte[]) msg.obj;//通过message,拿到字节数组
                    Bitmap bitmap = BitmapFactory.decodeByteArray(obj, 0, obj.length);//使用BitmapFactory工厂,把字节数组转换为bitmap
                    img_view.setImageBitmap(bitmap); //通过ImageView,设置图片
                    break;
                case FALL://当加载网络失败,执行的逻辑代码
                    Toast.makeText(MainActivity.this,"下载失败",Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };


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

        //初始化控件
        initView();
    }

    /**
     * 根据点击事件获取络上的图片资源,使用的是OKhttp框架
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_upload://上传
                //注意打印以下路径
                Log.i("yz",""+Environment.getExternalStorageDirectory() + "/Pictures/Screenshots");
                //创建上传文件对象
                File file = new File(Environment.getExternalStorageDirectory() + "/Pictures/Screenshots", "meinv.png");
                //创建RequestBody封装参数
                RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
                //创建MultipartBody,给RequestBody进行设置
                MultipartBody multipartBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("image", "meinv.png", requestBody)
                        .build();
                //创建Request
                Request requests = new Request.Builder()
                        .url(URL)
                        .post(multipartBody)
                        .build();
                //创建okhttp对象
                OkHttpClient okHttpClients = new OkHttpClient.Builder()
                        .readTimeout(10, TimeUnit.SECONDS)
                        .connectTimeout(10,TimeUnit.SECONDS)
                        .writeTimeout(10,TimeUnit.SECONDS)
                        .build();
                //上传完图片,得到服务器反馈数据
                okHttpClients.newCall(requests).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        Log.i("yz",""+e);
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });
                break;
            case R.id.btn_load://下载
                //1. 创建OKhttpClient对象
                OkHttpClient okHttpClient = new OkHttpClient.Builder()
                        .readTimeout(10, TimeUnit.SECONDS)
                        .connectTimeout(10,TimeUnit.SECONDS)
                        .writeTimeout(10,TimeUnit.SECONDS)
                        .build();
                //2.建立Request对象,设置参数,请求方式如果是get,就不用设置,默认使用的就是get
                Request request = new Request.Builder().url(PATH).build();
                //3.创建一个Call对象,参数是request对象,发送请求
                Call call = okHttpClient.newCall(request);
                //4.异步请求,请求加入调度
                call.enqueue(new Callback() {
                    @Override//请求失败回调
                    public void onFailure(Call call, IOException e) {
                        handler.sendEmptyMessage(FALL);
                    }

                    @Override//请求成功回调
                    public void onResponse(Call call, Response response) throws IOException {
                        //得到从网上获取资源,转换成我们想要的类型
                        byte[] bytes = response.body().bytes();
                        //通过handler更新UI
                        Message msg = handler.obtainMessage();
                        msg.obj = bytes;
                        msg.what = SUCCESS;
                        handler.sendMessage(msg);
                    }
                });
                break;
        }
    }

    private void initView() {
        btn_upload = findViewById(R.id.btn_upload);
        btn_load =findViewById(R.id.btn_load);
        img_view = findViewById(R.id.img_view);

        btn_upload.setOnClickListener(this);
        btn_load.setOnClickListener(this);
    }
}

猜你喜欢

转载自blog.csdn.net/yz1743585120/article/details/84034815