`
alian008580101
  • 浏览: 23075 次
社区版块
存档分类

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("重新下载");
	}
}

 
 

  • 大小: 19.3 KB
  • 大小: 17.3 KB
  • 大小: 19.4 KB
  • 大小: 17.5 KB
  • 大小: 19.2 KB
  • 大小: 17.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics