先看看布局文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:gravity="center"
>
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="130dp"
android:layout_height="41dp"
android:layout_marginBottom="2dp"
android:progressDrawable="@drawable/progress_style"
android:layout_marginRight="30dp"
android:layout_gravity="center"/>
<TextView android:id="@+id/progressText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginTop="7dp"
android:textSize="21dp"
android:textColor="#000000"
android:text="下载"/>
</RelativeLayout>
</LinearLayout>
ProgressBar的progressDrawable样式:progress_style.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景色图像资源 -->
<item android:id="@android:id/background" android:drawable="@drawable/download_button" />
<!-- 设置第二级进度条颜色图像资源 -->
<!--<item android:id="@android:id/secondaryProgress"-->
<!--android:drawable="@drawable/download_button" />-->
<!-- 设置第一级进度条颜色图像资源 -->
<item android:id="@android:id/progress" android:drawable="@drawable/progress_bg" />
</layer-list>
java代码:
MyActivity.java
package com.example.DownloadDemo;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
private ProgressBar progressBar;
private TextView progressText;
private Handler downHandler;
private int fileSize=0;
private int nowProgressValue=0;
private DownloadThread downThread;
private Handler mainHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 500:
if (nowProgressValue<=fileSize){
if(progressText.getText().equals("打开")){
Toast toast=Toast.makeText(MyActivity.this,"下载完成",500);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}else{
fileSize=msg.arg1;
progressBar.setMax(fileSize);
new Thread(){
@Override
public void run() {
while (true){
progressBar.setProgress(nowProgressValue);
}
}
}.start();
}
}else{
// Toast toast=Toast.makeText(NoticeContentActivity.this,"当前附件已下载",500);
// toast.setGravity(Gravity.CENTER,0,0);
// toast.show();
}
break;
case 600:
//这一块显示当前下载的百分比
nowProgressValue=msg.arg1;
if(nowProgressValue<=fileSize){
progressText.setTextColor(Color.BLACK);
System.out.println("<<<<<<"+fileSize+"<<<"+nowProgressValue);
double aa=((double)nowProgressValue/(double)fileSize);
System.out.println("<<<<<<<<<"+(Math.round(aa*100)/100.0));
progressText.setText((int)(aa* 100)+ "%");
}else{
}
break;
case 700:
progressText.setText("下载");
progressText.setTextColor(Color.BLACK);
Toast toast=Toast.makeText(MyActivity.this,"网络异常或当前附件不存在",500);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
break;
case 800:
Toast toast1=Toast.makeText(MyActivity.this,"URL异常,请联系管理员",500);
toast1.setGravity(Gravity.CENTER,0,0);
toast1.show();
break;
default:
break;
}
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
downThread=new DownloadThread(mainHandler);
downThread.start();
do{
downHandler=downThread.getDownHandler();
}while (null==downHandler);
setContentView(R.layout.main);
progressText=(TextView)findViewById(R.id.progressText);
progressBar=(ProgressBar)findViewById(R.id.progressBar1);
//通知下载线程
progressBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("<<<<"+nowProgressValue+"<<<"+fileSize);
Toast toast=Toast.makeText(MyActivity.this,"正在请求网络,请稍后",500);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
progressText.setText("稍等");
progressText.setTextColor(Color.GREEN);
Message msg=new Message();
msg.what=100;
//下载地址
msg.obj ="http://shouji.360tpcdn.com/140317/632594485ef016e50155b3a28af354e8/com.mfp.frozen.playgame.disney_10.apk";
downHandler.sendMessage(msg);
}
});
}
}
DownloadThread.java
package com.example.DownloadDemo;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
/**
* Created with IntelliJ IDEA.
* User: hld
* Date: 14-1-13
* Time: ����1:35
* To change this template use File | Settings | File Templates.
*/
public class DownloadThread extends Thread{
private Handler downHandler;//自己的handler
private Handler mainHandler;//主线程的Handler
public boolean isPause=false; //是否暂停true为暂停
public boolean isResume=false;//是否继续下载true为暂停状态̬
private int nowSize=0;//下载字节数
private int FileSize=0;//文件总字节数
public DownloadThread(Handler mainHandler){
this.mainHandler=mainHandler;
}
public synchronized Handler getDownHandler(){
return downHandler;
}
@Override
public void run() {
Looper.prepare(); //默认一个线程里面不存在消息循环,需要调用Looper.prepare()来给线程创建一个消息循环
downHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){//看看主线程给我发什么消息?
case 100://100:开始下载
isPause=false;
isResume=false;
startDown((String)msg.obj,0);
break;
default:
break;
}
super.handleMessage(msg);
}
};
Looper.loop();// Looper.loop();//调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息
}
//下载方法
public void startDown(String fileUrl,long startPosition){
try {
URL url= null;
url = new URL(fileUrl);
HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
if(isResume){
//网络上的文件,我怎么能够从指定位置开始下载呢
httpURLConnection.setRequestProperty("Range","bytes="+startPosition+"-"+FileSize);
}else{
//得到文件大小(字节)
int fileSize=httpURLConnection.getContentLength();
FileSize=fileSize;
//告诉主线程开始下载了
Message msgStart=new Message();
msgStart.what=500;
msgStart.arg1=fileSize;
mainHandler.sendMessage(msgStart);
}
InputStream inputStream=httpURLConnection.getInputStream();
String fileName=fileUrl.substring(fileUrl.lastIndexOf("/")+1);
String decodeString = URLDecoder.decode(fileName, "GBK");
String lastFilename=decodeString.substring(18);
System.out.print("decode"+decodeString);
System.out.println("<<<<<"+lastFilename);
File file=new File(Environment.getExternalStorageDirectory().getPath()+"/ceshi/"+lastFilename);
//判断是否存在父目录,如果没有,自动创建一个
file.getParentFile().mkdir();
//SDCard保存文件问题
RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");
randomAccessFile.seek(startPosition);
byte[] buffer=new byte[1024];
int count=0;
if(isResume){
nowSize=(int)startPosition;
}
while (!isPause){
count=inputStream.read(buffer);
if(count!=-1){
randomAccessFile.write(buffer,0,count);
}else{
break;
}
nowSize=nowSize+count;
Message msg=new Message();
msg.what=600;
msg.arg1=nowSize;
mainHandler.sendMessage(msg);
}
inputStream.close();
randomAccessFile.close();
httpURLConnection.disconnect();
}
catch (MalformedURLException e) {
Message msg=new Message();
msg.what=800;
mainHandler.sendMessage(msg);
e.printStackTrace(); //To change body of catc0h statement use File | Settings | File Templates.
}
catch (IOException e) {
Message msg=new Message();
msg.what=700;
mainHandler.sendMessage(msg);
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
源码下载地址