Android多线程断点下载download-helper.jar包使用

       工作闲余网查了一番Android多线程断点下载的资料,大多数方式都是将整个文件分段然后再分给几个线程进行下载,这里个人觉着分块下载最后整合的方式速度尚可,经过整合后一个download-manager.jar(包中有源码附有文字说明,通俗易懂),此包同时依赖http://alian008580101.iteye.com/blog/1948303中的后面四个包,下载导入项目即可

效果图1(单击下载):

效果图2(暂停下载):

 
效果图3继续下载):

 
效果图4取消下载):

 
效果图5重新下载):

 
效果图6(完成下载):

 
使用方法:

1.布局文件:

<?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="vertical">
	<Button 
	    android:id="@+id/buttonDownload"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"/>
	<TextView 
	    android:id="@+id/textInfo"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:lines="2"
	    android:gravity="center"
	    android:textSize="18sp"
	    android:text="wwwww"/>
	<com.whl.downloadmanager.TextProgressBar 
	    android:id="@+id/progressBarTest"
	    style="?android:attr/progressBarStyleHorizontal"
	    android:layout_width="match_parent"
	    android:layout_height="20dp"/>
	<Button 
	    android:id="@+id/buttonCancel"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="取消下载"/>
</LinearLayout>

 2.自定义进度条(网上寻找的可以显示进度)

package com.whl.downloadmanager;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.ProgressBar;

public class TextProgressBar extends ProgressBar {
    private String text;
    private Paint mPaint;
    private boolean isTextVisibility = true;
    public TextProgressBar(Context context) {
        super(context);
        initText();
    }

    public TextProgressBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initText();
    }

    public TextProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initText();
    }

    @Override
    public void setProgress(int progress) {
        setText(progress);
        super.setProgress(progress);

    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Rect rect = new Rect();
        this.mPaint.getTextBounds(this.text, 0, this.text.length(), rect);
        int x = (getWidth() / 2) - rect.centerX();
        int y = (getHeight() / 2) - rect.centerY();
        canvas.drawText(this.text, x, y, this.mPaint);
    }

    // 初始化,画笔
    private void initText() {
        this.mPaint = new Paint();
        this.mPaint.setAntiAlias(true);
        this.mPaint.setColor(Color.WHITE);

    }

    // 设置文字内容
    private void setText(int progress) {
    	if(isTextVisibility){
    		float percent = (progress * 1.0f / this.getMax()) * 100;
            this.text = String.format("%.2f%%", percent);
    	}else{
    		 this.text = "";
    	}
        
    }
    
    public void setTextVisibility(boolean isTextVisibility){
    	this.isTextVisibility = isTextVisibility;
    }
}

 3.MainActivity

package com.whl.downloadmanager;

import java.io.File;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.whl.database.CreateDatabaseHelper;
import com.whl.helper.activity.DownloadListener;
import com.whl.helper.activity.MultiThreadDownload;

public class MainActivity extends Activity implements OnClickListener,DownloadListener{
	private static final String TAG = "MainActivity";
	private static final String SD_PATH = Environment.getExternalStorageDirectory().getPath();
	
	private boolean isPause = false;
	private MultiThreadDownload multiThreadDownload ;
	private Button buttonDownload;
	private Button buttonCancel;
	private TextProgressBar progressBarTest;//可以使用普通的进度,该进度条是可以显示现在完成度
	private TextView textInfo;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);//布局文件就是两个简单的按钮一个用于暂停继续下载,一个用于取消任务,还有一个文本用于显示已完成,文件大小,下载完成度,下载速度等信息以及一个进度条。
		//http://d1.apk8.com:8020/game/plantsvszombies2.apk
		
		buttonDownload = (Button)findViewById(R.id.buttonDownload);
		buttonDownload.setText("单击下载");
		buttonDownload.setOnClickListener(this);
		progressBarTest = (TextProgressBar) findViewById(R.id.progressBarTest);
		textInfo = (TextView) findViewById(R.id.textInfo);
		
		buttonCancel = (Button) findViewById(R.id.buttonCancel);
		buttonCancel.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		String downloadUrl = "http://dldir1.qq.com/invc/qqpinyin/QQInput4.1_1133(1001).apk";
		String savePath = SD_PATH+File.separator+"downloadHelper"+File.separator;
		String fileName = "QQInput.apk";
		switch(v.getId()){
		case R.id.buttonDownload:
			if(!isPause){
				multiThreadDownload = new MultiThreadDownload(MainActivity.this,downloadUrl, savePath, fileName, this);
				multiThreadDownload.start();
				buttonDownload.setText("下载...");
				isPause = true;
			}else{
				buttonDownload.setText("暂停...");
				isPause = false;
				multiThreadDownload.onPause();
				multiThreadDownload = null;
			}
			break;
		case R.id.buttonCancel:
			if(multiThreadDownload==null){
				multiThreadDownload = new MultiThreadDownload(MainActivity.this,downloadUrl, savePath, fileName, this);
			}
			Log.d(TAG, ""+multiThreadDownload.isDownload());
			if(multiThreadDownload.isDownload()){
				multiThreadDownload.onCancel();
				isPause = false;
			}
			multiThreadDownload = null;
			break;
		}
	}
	
	private Handler multiHandler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what==1){
				Bundle data = msg.getData();
				float downloadSpeed = data.getFloat("downloadSpeed");
				boolean speedHigh = false;
				if(downloadSpeed>500){
					speedHigh = true;
					downloadSpeed/=1024;
				}
				progressBarTest.setProgress(data.getInt("completedSize"));
				textInfo.setText(String.format("已完成:%.2fMB", data.getInt("completedSize")/1024f/1024)+"/"+
								 String.format("总大小:%.2fMB", data.getInt("fileSize")/1024f/1024)+"\n"+
								 String.format("进度:%.2f%%", data.getBoolean("isCompleted")?100.00:data.getFloat("downloadPercent"))+"/"+
								 String.format(speedHigh?"速度:%.2fM/S":"速度:%.2fKB/S", downloadSpeed));
				if(data.getBoolean("isCompleted")){
					buttonDownload.setText("下载完成");
					textInfo.setText("下载完成");
				}
			}
		}
		
	};
	@Override
	public void onDownloading(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize,int completedSize,int downloadedSize,float downloadPercent, float downloadSpeed) {
		Log.d("MainActivity", isCompleted+"||"+isPause+"||"+completedSize+"||"+downloadedSize+"||"+downloadPercent+"||"+downloadSpeed);
		Message message = Message.obtain();
		message.what = 1;
		Bundle data = new Bundle();
		data.putBoolean("isCancel", isCancel);
		data.putBoolean("isCompleted", isCompleted);
		data.putInt("fileSize", fileSize);
		data.putInt("completedSize", completedSize);
		data.putInt("downloadedSize", downloadedSize);
		data.putFloat("downloadPercent", downloadPercent);
		data.putFloat("downloadSpeed", downloadSpeed);
		message.setData(data);
		multiHandler.sendMessage(message);
	}
	@Override
	public void onBeforeDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){
		progressBarTest.setMax(fileSize);
	}
	@Override
	public void onAfterDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){
		
	}
	@Override
	public void onPause(boolean isCompelted,boolean isPause,boolean isCancel,int fileSize,int completedSize,int downloadedSize,float downloadPercent,float downloadSpeed){
		textInfo.setText("暂停...");
		Log.d(TAG, "暂停...");
	}
	@Override
	public void onCancelDownload(){
		progressBarTest.setProgress(0);
		textInfo.setText("下载取消");
		buttonDownload.setText("重新下载");
	}
}

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据网上寻找的资料,加上自己的整合,打的一个Android线下载。可以实现断点下载,暂停继续取消下载,能够显示现在已完成大小,文件大小,完成度,下载速度等。使用方法如下: public class MainActivity extends Activity implements OnClickListener,DownloadListener{ private static final String TAG = "MainActivity"; private static final String SD_PATH = Environment.getExternalStorageDirectory().getPath(); private boolean isPause = false; private MultiThreadDownload multiThreadDownload ; private Button buttonDownload; private Button buttonCancel; private TextProgressBar progressBarTest;//可以使用普通的进度,该进度条是可以显示现在完成度 private TextView textInfo; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);//布局文件就是两个简单的按钮一个用于暂停继续下载,一个用于取消任务,还有一个文本用于显示已完成,文件大小,下载完成度,下载速度等信息以及一个进度条。 //http://d1.apk8.com:8020/game/plantsvszombies2.apk buttonDownload = (Button)findViewById(R.id.buttonDownload); buttonDownload.setText("单击下载"); buttonDownload.setOnClickListener(this); progressBarTest = (TextProgressBar) findViewById(R.id.progressBarTest); textInfo = (TextView) findViewById(R.id.textInfo); buttonCancel = (Button) findViewById(R.id.buttonCancel); buttonCancel.setOnClickListener(this); } @Override public void onClick(View v) { String downloadUrl = "http://dldir1.qq.com/invc/qqpinyin/QQInput4.1_1133(1001).apk"; String savePath = SD_PATH+File.separator+"downloadHelper"+File.separator; String fileName = "QQInput.apk"; switch(v.getId()){ case R.id.buttonDownload: if(!isPause){ multiThreadDownload = new MultiThreadDownload(MainActivity.this,downloadUrl, savePath, fileName, this); multiThreadDownload.start(); buttonDownload.setText("下载..."); isPause = true; }else{ buttonDownload.setText("暂停..."); isPause = false; multiThreadDownload.onPause(); multiThreadDownload = null; } break; case R.id.buttonCancel: if(multiThreadDownload==null){ multiThreadDownload = new MultiThreadDownload(MainActivity.this,downloadUrl, savePath, fileName, this); } Log.d(TAG, ""+multiThreadDownload.isDownload()); if(multiThreadDownload.isDownload()){ multiThreadDownload.onCancel(); isPause = false; } multiThreadDownload = null; break; } } private Handler multiHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==1){ Bundle data = msg.getData(); float downloadSpeed = data.getFloat("downloadSpeed"); boolean speedHigh = false; if(downloadSpeed>500){ speedHigh = true; downloadSpeed/=1024; } progressBarTest.setProgress(data.getInt("completedSize")); textInfo.setText(String.format("已完成:%.2fMB", data.getInt("completedSize")/1024f/1024)+"/"+ String.format("总大小:%.2fMB", data.getInt("fileSize")/1024f/1024)+"\n"+ String.format("进度:%.2f%%", data.getBoolean("isCompleted")?100.00:data.getFloat("downloadPercent"))+"/"+ String.format(speedHigh?"速度:%.2fM/S":"速度:%.2fKB/S", downloadSpeed)); if(data.getBoolean("isCompleted")){ buttonDownload.setText("下载完成"); textInfo.setText("下载完成"); } } } }; @Override public void onDownloading(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize,int completedSize,int downloadedSize,float downloadPercent, float downloadSpeed) { Log.d("MainActivity", isCompleted+"||"+isPause+"||"+completedSize+"||"+downloadedSize+"||"+downloadPercent+"||"+downloadSpeed); Message message = Message.obtain(); message.what = 1; Bundle data = new Bundle(); data.putBoolean("isCancel", isCancel); data.putBoolean("isCompleted", isCompleted); data.putInt("fileSize", fileSize); data.putInt("completedSize", completedSize); data.putInt("downloadedSize", downloadedSize); data.putFloat("downloadPercent", downloadPercent); data.putFloat("downloadSpeed", downloadSpeed); message.setData(data); multiHandler.sendMessage(message); } @Override public void onBeforeDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){ progressBarTest.setMax(fileSize); } @Override public void onAfterDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){ } @Override public void onPause(boolean isCompelted,boolean isPause,boolean isCancel,int fileSize,int completedSize,int downloadedSize,float downloadPercent,float downloadSpeed){ textInfo.setText("暂停..."); Log.d(TAG, "暂停..."); } @Override public void onCancelDownload(){ progressBarTest.setProgress(0); textInfo.setText("下载取消"); buttonDownload.setText("重新下载"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值