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

来源:互联网 发布:人工智能会议 2017 编辑:程序博客网 时间:2024/06/06 13:13

工作闲余网查了一番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;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//布局文件就是两个简单的按钮一个用于暂停继续下载,一个用于取消任务,还有一个文本用于显示已完成,文件大小,下载完成度,下载速度等信息以及一个进度条。//http://d1.apk8.com:8020/game/plantsvszombies2.apkbuttonDownload = (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);}@Overridepublic 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(){@Overridepublic 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("下载完成");}}}};@Overridepublic 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);}@Overridepublic void onBeforeDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){progressBarTest.setMax(fileSize);}@Overridepublic void onAfterDownload(boolean isCompleted,boolean isPause,boolean isCancel,int fileSize){}@Overridepublic void onPause(boolean isCompelted,boolean isPause,boolean isCancel,int fileSize,int completedSize,int downloadedSize,float downloadPercent,float downloadSpeed){textInfo.setText("暂停...");Log.d(TAG, "暂停...");}@Overridepublic void onCancelDownload(){progressBarTest.setProgress(0);textInfo.setText("下载取消");buttonDownload.setText("重新下载");}}




原创粉丝点击