布局:
<?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.imageloadademo.MainActivity"> <Button android:id="@+id/btn_startLoad" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开始下载"/> <Button android:id="@+id/btn_stopLoad" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="暂停下载"/> <ProgressBar android:id="@+id/progressbar" android:layout_width="match_parent" android:layout_height="30dp" style="?android:attr/progressBarStyleHorizontal"/> <ImageView android:id="@+id/iv_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" android:scaleType="fitCenter" />
</LinearLayout>
MainActivity :
package com.example.imageloadademo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int START = 0; private static final int DOWNLOADING=1; public static final int END=2; private Button btn_startLoad; private Button btn_stopLoad; private ProgressBar progressbar; private ImageView iv_image; //定义一个变量判断是否暂停 private boolean isPause; private ByteArrayOutputStream bos; private int mSize=0; private int mCurrentProgress; private MyHandler mHandler = new MyHandler(MainActivity.this); private class MyHandler extends Handler { private WeakReference<MainActivity> mWeakRefernce; public MyHandler(MainActivity downloadActivity) { mWeakRefernce = new WeakReference<MainActivity>(downloadActivity); } @Override public void handleMessage(Message msg) { switch (msg.what) { case START: int max = msg.arg1; mWeakRefernce.get().progressbar.setMax(max); break; case DOWNLOADING: mCurrentProgress += msg.arg1; mWeakRefernce.get().progressbar.setProgress(mCurrentProgress); break; case END: Bitmap bitmap = (Bitmap) msg.obj; mWeakRefernce.get().iv_image.setImageBitmap(bitmap); break; } super.handleMessage(msg); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { btn_startLoad = (Button) findViewById(R.id.btn_startLoad); btn_stopLoad = (Button) findViewById(R.id.btn_stopLoad); progressbar = (ProgressBar) findViewById(R.id.progressbar); iv_image = (ImageView) findViewById(R.id.iv_image); btn_startLoad.setOnClickListener(this); btn_stopLoad.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_startLoad: //下载的方法 startDownLoad(); break; case R.id.btn_stopLoad: //暂停了让IsPause为true isPause=true; break; } } private void startDownLoad() { //开始下载使IsPause为true isPause=false; //将内存流转换为Bitmap然后显示出来 bos = new ByteArrayOutputStream(); //获取请求Request Request.Builder builder = new Request.Builder(); //添加路径 builder.url(Constans.FILE_URL); mSize=bos.size(); if(mSize>0){ builder.addHeader("Range","bytes="+mSize+"-"); mCurrentProgress+=mSize; } //开始请求 异步请求 new OkHttpClient().newCall(builder.build()).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { InputStream is = null; if (response.isSuccessful()) { //这是获取的流 is = response.body().byteStream(); if (mSize == 0) { int max = (int) response.body().contentLength(); mHandler.obtainMessage(START, max, 0).sendToTarget(); } int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { if (isPause) break; bos.write(buffer, 0, len); mHandler.obtainMessage(DOWNLOADING, len, 0).sendToTarget(); } Bitmap bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.toByteArray().length); mHandler.obtainMessage(END, bitmap).sendToTarget(); bos.close(); is.close(); } } }); } }