安卓文件下载,显示下载进度

先看看布局文件:


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.
        }


    }
}
源码下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值