最新多线程下载Demo

来源:互联网 发布:java无参构造方法举例 编辑:程序博客网 时间:2024/06/08 17:45

第一步 :导依赖

compile 'com.youth.banner:banner:1.4.9'compile 'com.squareup.retrofit2:converter-gson:2.0.2'compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'compile 'io.reactivex:rxjava:1.0.14'compile 'io.reactivex:rxandroid:1.0.1'compile 'com.github.bumptech.glide:glide:3.7.0'compile 'com.android.support:recyclerview-v7:26.+'compile 'org.easybatch:easybatch-gson:5.1.0'compile 'com.squareup.okhttp3:okhttp:3.9.0'compile 'com.squareup.okio:okio:1.13.0'compile 'fm.jiecao:jiecaovideoplayer:5.5'



《清单文件》

<activity android:name=".activity.MainActivity"    android:configChanges="orientation|screenSize|keyboardHidden"    android:screenOrientation="portrait"    >    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>


第二步:网络加权限

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

第三步:封装retrofit+Rxjava

建一个Net 工具包

get 请求

RequestApi

package com.example.snmsung.disanzhoukaomonidemo.net;import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean;import retrofit2.http.GET;import rx.Observable;public interface RequestApi {    public static final String BASE_URL = "根据需求";    @GET("根据需求")    Observable<MyBean> getData();}
RetrofitUtlie

package com.example.snmsung.disanzhoukaomonidemo.net;import java.util.concurrent.TimeUnit;import okhttp3.OkHttpClient;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;public class RetrofitUtlie {    public static RequestApi doHttpdeal() {        OkHttpClient Client = new OkHttpClient.Builder()                .connectTimeout(5, TimeUnit.SECONDS)                .readTimeout(5, TimeUnit.SECONDS)                //.addNetworkInterceptor(new MyInterceptro())                .build();        Retrofit retrofit = new Retrofit.Builder()                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .addConverterFactory(GsonConverterFactory.create())                .client(Client)                .baseUrl(RequestApi.BASE_URL)                .build();        RequestApi api = retrofit.create(RequestApi.class);        return api;    }}

第四步:建Bean类

MyBean
import java.util.List;public class MyBean {       private int code;    private String msg;    private List<DataBean> data;    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public List<DataBean> getData() {        return data;    }    public void setData(List<DataBean> data) {        this.data = data;    }    public static class DataBean {               private String content;        private int id;        private String image_url;        private String title;        private int type;        private String vedio_url;        public String getContent() {            return content;        }        public void setContent(String content) {            this.content = content;        }        public int getId() {            return id;        }        public void setId(int id) {            this.id = id;        }        public String getImage_url() {            return image_url;        }        public void setImage_url(String image_url) {            this.image_url = image_url;        }        public String getTitle() {            return title;        }        public void setTitle(String title) {            this.title = title;        }        public int getType() {            return type;        }        public void setType(int type) {            this.type = type;        }        public String getVedio_url() {            return vedio_url;        }        public void setVedio_url(String vedio_url) {            this.vedio_url = vedio_url;        }    }}
第五部:适配器Adapter  RecyclerView的

MyAdapter

package com.example.snmsung.disanzhoukaomonidemo.Adapter;import android.content.Context;import android.content.SharedPreferences;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean;import com.example.snmsung.disanzhoukaomonidemo.R;import java.util.List;import static android.content.Context.MODE_PRIVATE;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> implements View.OnClickListener {    private Context context;    private List<MyBean.DataBean> data;    private MyHolder myHolder;    private OnItemClickListener mOnItemClickListener1 = null;    private OnItemClickListener mOnItemClickListener = null;    @Override    public void onClick(View view) {        if (mOnItemClickListener != null) {            //注意这里使用getTag方法获取position            mOnItemClickListener.onItemClick(view, (int) view.getTag());            SharedPreferences sfp=context.getSharedPreferences("user",MODE_PRIVATE);            sfp.edit().putString("url",data.get((int) view.getTag()).getVedio_url()).commit();        }    }    public static interface OnItemClickListener {        void onItemClick(View view, int position);    }    public MyAdapter(Context context, List<MyBean.DataBean> list1) {        this.context = context;        this.data = list1;    }    @Override    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = View.inflate(context, R.layout.item, null);        myHolder = new MyHolder(view);        //将创建的View注册点击事件        view.setOnClickListener(this);        return myHolder;    }    @Override    public void onBindViewHolder(MyHolder holder, int position) {        holder.textView.setText(data.get(position).getTitle());        Glide.with(context).load(data.get(position).getImage_url()).into(holder.imageView);        //将position保存在itemView的Tag中,以便点击时进行获取        myHolder.itemView.setTag(position);    }    public void setOnItemClickListener(OnItemClickListener listener) {        this.mOnItemClickListener = listener;    }    @Override    public int getItemCount() {        return data == null ? 0 : data.size();    }    public class MyHolder extends RecyclerView.ViewHolder {        private final ImageView imageView;        private final TextView textView;        public MyHolder(View itemView) {            super(itemView);            imageView = (ImageView) itemView.findViewById(R.id.img);            textView = (TextView) itemView.findViewById(R.id.tv);        }    }}
 BaseAdapter的

package com.example.snmsung.disanzhoukaomonidemo.Adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import com.bumptech.glide.Glide;import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean;import com.example.snmsung.disanzhoukaomonidemo.R;import java.util.List;import static android.R.id.list;public class MyAdapter1 extends BaseAdapter{  List<MyBean.DataBean> list1;    private Context context;    private MyViewHolder myViewHolder;    public MyAdapter1(Context context, List<MyBean.DataBean> list1) {        this.context=context;        this.list1=list1;    }    @Override    public int getCount() {        return list1==null?0:list1.size();    }    @Override    public Object getItem(int i) {        return list1.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View convertView, ViewGroup viewGroup) {        if (convertView==null){            convertView=View.inflate(context, R.layout.item1,null);            myViewHolder = new MyViewHolder();            myViewHolder.imageView=(ImageView) convertView.findViewById(R.id.img1);            convertView.setTag(myViewHolder);        }else{            myViewHolder= (MyViewHolder) convertView.getTag();        }        Glide.with(context).load(list1.get(i).getImage_url()).into(myViewHolder.imageView);        return convertView;    }    public  class MyViewHolder{        ImageView imageView;    }}
第六步:建一个Utiles工具包

DialogUtils
package com.example.snmsung.disanzhoukaomonidemo.Utlies;import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.os.AsyncTask;import android.os.Bundle;import android.os.SystemClock;import android.util.Log;import com.example.snmsung.disanzhoukaomonidemo.activity.ShiPinBoFang;import java.io.File;import java.io.IOException;import static android.content.Context.MODE_APPEND;public class DialogUtils {    private Context context;    public static long MAX_SIZE = 0;    public static long PROGRESS = -2;    private static String userr;    public static void showUpdataDialog(final Context context) {        AlertDialog.Builder builder = new AlertDialog.Builder(context);        builder.setTitle("是否更新");        builder.setMessage("太旧了,更新吧");        builder.setNegativeButton("就不", null);        builder.setPositiveButton("可以", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialogInterface, int i) {                SharedPreferences sharedPreferences = context.getSharedPreferences("user", MODE_APPEND);                userr = sharedPreferences.getString("url", null);                Log.i("=======asdsasdsa=======", "onClick: " + userr);                new DownLoadThread(userr, context.getCacheDir() + "shipin.mp4").start();                showProgress(context);            }        });        builder.show();    }    public static void showProgress(final Context context) {        final ProgressDialog pd = new ProgressDialog(context);        pd.setTitle("正在更新");        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        pd.setMax(100);        pd.show();        new AsyncTask<String, Integer, String>() {            @Override            protected String doInBackground(String... strings) {                while (PROGRESS + 1 < MAX_SIZE) {                    SystemClock.sleep(100);                    if (MAX_SIZE > 0) {                        publishProgress((int) (PROGRESS * 100 / MAX_SIZE));                    }                }                return null;            }            @Override            protected void onPostExecute(String s) {                super.onPostExecute(s);                pd.dismiss();                File file = new File(context.getCacheDir() + "/app-release.apk");                String command = "chmod " + "777" + " " + file.getPath();                Runtime runtime = Runtime.getRuntime();                try {                    runtime.exec(command);                } catch (IOException e) {                    e.printStackTrace();                }                Bundle bundle = new Bundle();                Intent intent = new Intent(context, ShiPinBoFang.class);                bundle.putString("userr", userr);                intent.putExtras(bundle);                context.startActivity(intent);////                Intent intent = new Intent(Intent.ACTION_VIEW);//// 由于没有在Activity环境下启动Activity,设置下面的标签//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//                intent.setDataAndType(Uri.fromFile(file),//                        "application/vnd.android.package-archive");//                context.startActivity(intent);//            }            @Override            protected void onProgressUpdate(Integer... values) {                super.onProgressUpdate(values);                pd.setProgress(values[0]);            }        }.execute();    }}

DownLoadTask
package com.example.snmsung.disanzhoukaomonidemo.Utlies;public class DownLoadTask extends  Thread{    String downLoadUrl;    String path;    int blockSize;    int startPosition;    public DownLoadTask(String downLoadUrl, String path, int blockSize, int startPosition) {        this.downLoadUrl = downLoadUrl;        this.path = path;        this.blockSize = blockSize;        this.startPosition = startPosition;    }    @Override    public void run() {        super.run();        NetUtils.downloadFile(downLoadUrl,path,blockSize,startPosition);    }}

DownLoadThread
package com.example.snmsung.disanzhoukaomonidemo.Utlies;public class DownLoadThread extends  Thread{    private String downLoadUrl = "";    private String path;    private int threadNum = 5;    public DownLoadThread(String downLoadUrl, String path) {        this.downLoadUrl = downLoadUrl;        this.path = path;        this.threadNum = threadNum;    }    @Override    public void run() {        int len = NetUtils.getFileLength(downLoadUrl);        DialogUtils.MAX_SIZE = len;        int blockSize = len / threadNum;        for (int i = 0; i < threadNum; i++) {            int startPosition = i * blockSize;            if (i == threadNum - 1) {                blockSize = len - blockSize * (threadNum - 1);            }            new DownLoadTask(downLoadUrl, path, blockSize, startPosition).start();        }    }}

NetUtils
package com.example.snmsung.disanzhoukaomonidemo.Utlies;import android.util.Log;import java.io.BufferedInputStream;import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL; public class NetUtils {    public static void downloadFile(String downloadUrl, String path, int blockSize, int startPosition){        BufferedInputStream bis = null;        RandomAccessFile raf = null;        try {            File f = new File(path);            if(!f.exists()){                f.createNewFile();            }            URL url = new URL(downloadUrl);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setReadTimeout(8000);            conn.setConnectTimeout(8000);//            long start = 0;            if(blockSize > 0){//                //使用线程id来计算 当前线程的开始位置和结束位置//                start = blockSize * threadId;                long end = blockSize + startPosition - 1;                //多线程下载  需要告诉服务器我要请求的是哪部分内容  需要写在请求头里面                conn.setRequestProperty("Range", "bytes=" + startPosition + "-" + end);                Log.i(Thread.currentThread() + "======", "bytes=" + startPosition + "-" + end);            }            int code = conn.getResponseCode();            if(code < 400){                bis = new BufferedInputStream(conn.getInputStream());                raf = new RandomAccessFile(f, "rwd");                //                raf.seek(startPosition);                //                int len = 0;                byte[] buff = new byte[1024 * 8];                while((len = bis.read(buff)) != -1){                    synchronized (NetUtils.class){                        raf.write(buff, 0, len);                        if(DialogUtils.PROGRESS<0)                        {                            DialogUtils.PROGRESS=0;                        }                        DialogUtils.PROGRESS += len;                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }finally {            if(bis != null){                try {                    bis.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(raf != null){                try {                    raf.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    public static int getFileLength(String downloadUrl){        int len = 0;        try {            URL url = new URL(downloadUrl);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setReadTimeout(8000);            conn.setConnectTimeout(8000);            len = conn.getContentLength();        } catch (Exception e) {            e.printStackTrace();        }        return len;    }}
MainActivity   类

package com.example.snmsung.disanzhoukaomonidemo.activity;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;import com.example.snmsung.disanzhoukaomonidemo.Adapter.MyAdapter;import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean;import com.example.snmsung.disanzhoukaomonidemo.ImagGithub.ImgGithub;import com.example.snmsung.disanzhoukaomonidemo.R;import com.example.snmsung.disanzhoukaomonidemo.net.RetrofitUtlie;import com.youth.banner.Banner;import java.util.ArrayList;import java.util.List;import rx.Observer;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;public class MainActivity extends AppCompatActivity {    private Banner banner;    private List<String> list;    private RecyclerView recyclerView;    private MyAdapter myAdapter;    private List<MyBean.DataBean> data1;    private MyAdapter myAdapter1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //找到控件        inidata();        recyclerView.setLayoutManager(new LinearLayoutManager(this));    }    private void inidata() {        banner = (Banner) findViewById(R.id.banner);        recyclerView = (RecyclerView) findViewById(R.id.rec);        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));        banner.setImageLoader(new ImgGithub());        list = new ArrayList<>();        list.add("http://pic32.nipic.com/20130817/9745430_101836881000_2.jpg");        list.add("http://pic15.nipic.com/20110630/6322714_105943746342_2.jpg");        list.add("http://pic48.nipic.com/file/20140916/2531170_195153248000_2.jpg");        list.add("http://img.taopic.com/uploads/allimg/140626/240469-1406261S24553.jpg");        list.add("http://pic77.nipic.com/file/20150911/21721561_155058651000_2.jpg");        list.add("http://img4.duitang.com/uploads/item/201603/18/20160318103156_cziuY.jpeg");        banner.setImages(list);        banner.start();        //网络请求        qingqiu();    }    private void qingqiu() {        RetrofitUtlie.doHttpdeal().getData()               .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<MyBean>() {                    @Override                    public void onCompleted() {                        Log.i("======", "onNext: "+data1);                    }                    @Override                    public void onError(Throwable e) {                        e.printStackTrace();                        Log.i("====12===", "onNext: "+e.toString());                    }                    @Override                    public void onNext(MyBean myBean) {                        data1 = myBean.getData();                        Log.i("======3======", "onNext: "+data1);                        myAdapter1 = new MyAdapter(MainActivity.this, data1);                        recyclerView.setAdapter(myAdapter1);                        myAdapter1.setOnItemClickListener(new MyAdapter.OnItemClickListener() {                            @Override                            public void onItemClick(View view, int position) {                                Intent intent=new Intent(MainActivity.this,ShiPin.class);                                startActivity(intent);                            }                        });                    }                });    }}
ShiPin类

package com.example.snmsung.disanzhoukaomonidemo.activity;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.VideoView;import com.example.snmsung.disanzhoukaomonidemo.R;import com.example.snmsung.disanzhoukaomonidemo.Utlies.DialogUtils;import com.example.snmsung.disanzhoukaomonidemo.common.PlayerManager;public class ShiPin extends AppCompatActivity {    private PlayerManager player;    private VideoView video_view;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_shi_pin);        Intent intent=getIntent();      String  vedio_url = intent.getStringExtra("url");        DialogUtils.showUpdataDialog(this);    }}


ShiPinBoFang 类

package com.example.snmsung.disanzhoukaomonidemo.activity;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.MediaController;import android.widget.VideoView;import com.example.snmsung.disanzhoukaomonidemo.R;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;public class ShiPinBoFang extends AppCompatActivity {    private JCVideoPlayerStandard jcVideoPlayerStandard;    private VideoView video1;    private VideoView vv_video;    /*    使用VideoView+MediaController实现视频播放器     */    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_shi_pin_bo_fang);        video1 = (VideoView)findViewById(R.id.vidoView);        Intent intent=getIntent();        String url = intent.getStringExtra("userr");        //设置播放的来源        video1.setVideoPath(url);        //实例化媒体控制器        MediaController mediaController=new MediaController(this);        mediaController.setMediaPlayer(video1);        video1.setMediaController(mediaController);        }//        getSupportActionBar().setTitle("jiecaovideoplayer的使用");//        jcVideoPlayerStandard= (JCVideoPlayerStandard) findViewById(R.id.jiecao_Player);//        jcVideoPlayerStandard.setUp(url,jcVideoPlayerStandard.SCREEN_LAYOUT_NORMAL,"视频标题");//        Log.i("**********asdfg********", "onCreate: "+url.toString());//    }//    @Override//    public void onBackPressed() {//        if (JCVideoPlayer.backPress()){//            return;//        }//        super.onBackPressed();//    }////    @Override//    protected void onPause() {//        super.onPause();//        JCVideoPlayer.releaseAllVideos();//    }}
Main   布局XML


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.snmsung.disanzhoukaomonidemo.activity.MainActivity">    <com.youth.banner.Banner        android:id="@+id/banner"        android:layout_width="match_parent"        android:layout_height="205dp" />    <android.support.v7.widget.RecyclerView        android:id="@+id/rec"        android:layout_width="match_parent"        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></LinearLayout>
Shipin  布局XML

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.snmsung.disanzhoukaomonidemo.activity.ShiPin">    <com.example.snmsung.disanzhoukaomonidemo.widget.media.IjkVideoView        android:id="@+id/video_view"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>

 ShiPinBoFang布局 XML


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <VideoView        android:id="@+id/vidoView"        android:layout_width="match_parent"        android:layout_height="match_parent"></VideoView></LinearLayout>
  item  XML


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:id="@+id/img"        android:layout_width="120dp"        android:layout_height="120dp" />    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="25dp" /></LinearLayout>


item1  XML


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"> <ImageView     android:id="@+id/img1"     android:layout_width="match_parent"     android:layout_height="match_parent" /></LinearLayout>封装ImgGithub 



package com.example.snmsung.disanzhoukaomonidemo.ImagGithub;import android.content.Context;import android.widget.ImageView;import com.bumptech.glide.Glide;import com.youth.banner.loader.ImageLoader;public class ImgGithub extends ImageLoader{    @Override    public void displayImage(Context context, Object path, ImageView imageView) {        Glide.with(context).load(path).into(imageView);    }}

封装Okhttp

Okutil 

package com.example.snmsung.disanzhoukaomonidemo.okhttp;import android.os.Handler;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;public class Okutil {    private Handler handler=new Handler();    public Handler gerhanlder(){        return handler;    }    private static Okutil okutil=new Okutil();    private Okutil(){};    public static Okutil getinstans(){        return okutil;    }    private OkHttpClient okHttpClient;    public void init(){        if (okHttpClient==null){            okHttpClient=new OkHttpClient.Builder().build();        }    }    public void doget(String url, Callback callback){        init();        Request request=new Request.Builder().addHeader("User-Agent","").url(url).build();        Call call=okHttpClient.newCall(request);        call.enqueue(callback);    }} 
Okutilback 

package com.example.snmsung.disanzhoukaomonidemo.okhttp;import android.os.Handler;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.Request;import okhttp3.Response;public abstract class Okutilback implements Callback{    private Handler handler=Okutil.getinstans().gerhanlder();    public abstract void OnFild(Call call, IOException e);    public abstract void OnSuccess(String request) throws Exception;    @Override    public void onFailure(final Call call, final IOException e) {        handler.post(new Runnable() {            @Override            public void run() {                OnFild(call, e);            }        });    }    @Override    public void onResponse(Call call, Response response) throws IOException {        final String str=response.body().string();        handler.post(new Runnable() {            @Override            public void run() {                try {                    OnSuccess(str);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }}


网络拦截器


package com.example.snmsung.disanzhoukaomonidemo;import android.util.Log;import java.io.IOException;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;public class MyInterceptro implements Interceptor {    @Override    public Response intercept(Chain chain) throws IOException {        Request request=chain.request();        Log.i("===url====", "intercept: "+request.url());        Log.i("====res_headers====", "intercept: "+request.headers());      Response res=  chain.proceed(request);        Log.i("=====req_headers===", "intercept: "+res.headers());        Log.i("====body=======", "intercept: "+res.body().string());        return res;    }}


原创粉丝点击