多執行緒下載圖片的簡單例子
阿新 • • 發佈:2019-01-01
package com.example.kirito.myapplication.testdownload; import android.os.Environment; import android.os.Handler; import android.os.Message; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * Created by kirito on 2016.10.25. */ public class DownLoadHelp { //建立執行緒池 private Executor threadPool = Executors.newFixedThreadPool(3); private Handler handler; public DownLoadHelp(Handler handler) { this.handler = handler; } static class downRunnable implements Runnable{ private String url; private String filename; private long start; private long end; private Handler handler; public downRunnable(String url, String filename, long start, long end,Handler handler) { this.url = url; this.filename = filename; this.start = start; this.end = end; this.handler = handler; } @Override public void run() { HttpURLConnection con = null; try { URL urls = new URL(url); con = (HttpURLConnection) urls.openConnection(); con.setRequestMethod("GET"); con.setReadTimeout(5000); con.setRequestProperty("Range","bytes="+start+"-" + end); RandomAccessFile accessFile = new RandomAccessFile(new File(filename),"rwd"); accessFile.seek(start); InputStream is = con.getInputStream(); byte bt[] = new byte[4 * 1024]; int len = 0; while ((len = is.read(bt)) != -1){ accessFile.write(bt,0,len); } Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); if (accessFile != null){ accessFile.close(); } if (is != null){ is.close(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (con != null){ con.disconnect(); } } } } public void downLoadFile(String purl){ HttpURLConnection con = null; try { URL url = new URL(purl); con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setReadTimeout(5000); long length = con.getContentLength(); long block = length / 3; String fileName = getFileName(purl); File parent = Environment.getExternalStorageDirectory(); File downLoadFile = new File(parent,fileName); /** * 若length = 35,35/3=11 * i = 0,0-10 * i = 1,11-21 * i = 2,22-35(因為有for迴圈裡的if語句) */ for (int i = 0; i < 3; i++) { long start = i * block; long end = (i + 1) * block - 1; if (i == 2){ end = length; } downRunnable runnable = new downRunnable(purl,downLoadFile.getAbsolutePath(),start,end,handler); threadPool.execute(runnable); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (con != null){ con.disconnect(); } } } //獲取URL裡圖片的名字 private String getFileName(String url){ return url.substring(url.lastIndexOf('/') + 1); } }
測試介面
package com.example.kirito.myapplication.testdownload; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.example.kirito.myapplication.R; /** * Created by kirito on 2016.10.25. */ public class TestDownLoad extends AppCompatActivity { private Button btn; private TextView tv; private int count; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { count += msg.what; if (count == 3){ tv.setText("download success!"); } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.testgosn); btn = (Button) findViewById(R.id.td_btn); tv = (TextView) findViewById(R.id.td_tv); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { DownLoadHelp downLoadHelp = new DownLoadHelp(handler); downLoadHelp.downLoadFile("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2980880098,337923771&fm=116&gp=0.jpg"); } }).start(); } }); } }