您的位置:首页 > 移动开发 > Android开发

Android多线程断点下载jar包使用

2013-09-27 17:15 621 查看
工作闲余网查了一番Android多线程断点下载的资料,大多数方式都是将整个文件分段然后再分给几个线程进行下载,这里个人觉着分块下载最后整合的方式速度尚可,经过整合后一个download-manager.jar,依赖http://alian008580101.iteye.com/blog/1948303后面的四个jar文件,导入工程即可。

效果图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("重新下载");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: