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("重新下载");}}
- Android多线程断点下载jar包使用
- android多线程断点下载
- android 多线程断点下载
- android多线程断点下载
- android多线程断点下载
- android,多线程断点下载
- android多线程断点下载
- android多线程断点下载
- android 多线程断点下载
- Android多线程断点下载
- android多线程断点下载
- Android多线程断点下载
- Android多线程断点下载
- Android多线程断点下载
- Android多线程断点下载
- android----断点多线程下载
- Android多线程断点下载
- Android-多线程断点下载
- linux c读取配置文件打印多出输出最后一行问题
- 遍历目录树中所有模式匹配的文件
- 使用 SQL Developer 将 SQL Server 数据库移植到 Oracle 上
- 【iOS开发】---- iOS7适配问题
- Android调用天气预报的WebService简单例子
- Android多线程断点下载jar包使用
- linux小记10 创建本地yum源
- 毫秒必争,前端网页性能最佳实践
- libdvbpsi库的使用
- Objective-c中线程NSThread的使用
- uva 10651- Pebble Solitaire(状态压缩DP)待看。。。
- 逆向并查集(ZOJ 3261)
- Oracle分区表,哈希分区的新建与增加
- Android开发之WebService介绍