上传者: xywhlzh 
                                    |
                                    上传时间: 2022-03-10 19:42:52
                                    |
                                    文件大小: 22KB
                                    |
                                    文件类型: -
                                
                            
                                
                            
                                根据网上寻找的资料,加上自己的整合,打包的一个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("重新下载");
	}
}