`

下载进度比例显示

阅读更多

近几天因为在写高清壁纸的服务器端(基于PHP+MySql),所以好几天没更新博客了,顺便汇报一下高清壁纸的开发进度:服务器端已经改写,原来是一条数据一条数据加,现在是Flash批量上传图片,自动添加数据(这是后台,大家当然看不到啦)。另外,图片数据都放到自己的虚拟主机上了,所以大家可能觉得这几天下载图片特别慢。原来放POCO,速度比较快,但是毕竟是免费的,不放心,怕哪天被人发现了大流量下载,把我帐号图片删了,到时哭都来不及,而且那样也实现不了上传自动添加数据。新版客户端方面,目前多语言以及HVGA支持都已经完成,现在在做下载进度条(因为服务器稍慢,怕有些性子急的同学等不了)。汇报完毕,开始今天学习。今天的这段代码是网上找的,自己做了些小改,通过模拟器测试。文件下载进度条控制(就是为了高清壁纸加个进度条),自己研究了好久,但是进度条只能显示缓存写入文件的进度,不能显示下载进度。找了好久,终于找到一段用的代码,所以记录下来,大家分享。
布局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"
    >
<TextView  android:id="@+id/tv"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    />
<ProgressBar android:id="@+id/down_pb"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:max="100"
    style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
 



这个就不用解释了吧,两个控件,一个是TextView,一个是横向条状进度条
程序main.java:

package com.pocketdigi.download;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
 
import org.apache.http.client.ClientProtocolException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
public class main extends Activity {
    /** Called when the activity is first created. */
    ProgressBar pb;
    TextView tv;
    int   fileSize;
    int   downLoadFileSize;
    String fileEx,fileNa,filename;
    private Handler handler = new Handler()
      {
        @Override
        public void handleMessage(Message msg)
        {//定义一个Handler,用于处理下载线程与UI间通讯
          if (!Thread.currentThread().isInterrupted())
          {
            switch (msg.what)
            {
              case 0:
                pb.setMax(fileSize);
              case 1:
                pb.setProgress(downLoadFileSize);
                int result = downLoadFileSize * 100 / fileSize;
                tv.setText(result + "%");
                break;
              case 2:
                Toast.makeText(main.this, "文件下载完成", 1).show();
                break;
 
              case -1:
                String error = msg.getData().getString("error");
                Toast.makeText(main.this, error, 1).show();
                break;
            }
          }
          super.handleMessage(msg);
        }
      };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pb=(ProgressBar)findViewById(R.id.down_pb);
        tv=(TextView)findViewById(R.id.tv);
        new Thread(){
            public void run(){
                try {
                    down_file("http://wallpaper.pocketdigi.com/upload/1/bigImage/1284565196.jpg","/sdcard/");
                    //下载文件,参数:第一个URL,第二个存放路径
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }.start();
 
 
    }
    public void down_file(String url,String path) throws IOException{
        //下载函数      
        filename=url.substring(url.lastIndexOf("/") + 1);
        //获取文件名
        URL myURL = new URL(url);
        URLConnection conn = myURL.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();
        this.fileSize = conn.getContentLength();//根据响应获取文件大小
        if (this.fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");
        if (is == null) throw new RuntimeException("stream is null");
        FileOutputStream fos = new FileOutputStream(path+filename);
        //把数据存入路径+文件名
        byte buf[] = new byte[1024];
        downLoadFileSize = 0;
        sendMsg(0);
        do
          {
            //循环读取
            int numread = is.read(buf);
            if (numread == -1)
            {
              break;
            }
            fos.write(buf, 0, numread);
            downLoadFileSize += numread;
 
            sendMsg(1);//更新进度条
          } while (true);
        sendMsg(2);//通知下载完成
        try
          {
            is.close();
          } catch (Exception ex)
          {
            Log.e("tag", "error: " + ex.getMessage(), ex);
          }
 
    }
    private void sendMsg(int flag)
    {
        Message msg = new Message();
        msg.what = flag;
        handler.sendMessage(msg);
    }     
分享到:
评论

相关推荐

    易语言FTP下载带进度

    易语言是一种专为中国人设计的编程语言,它的目标是让编程变得简单、直观。FTP(File Transfer Protocol)是互联网...通过学习和理解这个模块,开发者可以深入掌握FTP通信和进度显示的原理,提升自己的易语言编程技能。

    vb编写的带进度的网络下载文件代码

    3. **带进度的下载**:为了显示下载进度,我们需要知道文件的总大小,并在下载过程中实时更新已下载的字节数。VB中可以使用Async/Await关键字配合异步操作来实现这一目标,或者使用线程和回调函数来更新进度条。 4....

    BAT批处理脚本-提示窗口进度条-显示进度.zip

    如果脚本需要处理大量文件,可能会结合FINDSTR、COPY或XCOPY命令,同时实时计算并显示已处理文件的数量与总文件数量的比例。 批处理脚本在自动化的日常任务中非常有用,例如批量重命名文件、清理临时文件、备份数据...

    c# 命令行 显示完成进度

    在C#编程中,命令行显示处理进度是常见的需求,特别是在执行长时间运行的任务或大量数据处理时,用户界面反馈能够提升用户体验。本篇将详细解释如何在C#命令行环境中实现显示任务完成进度。 首先,我们需要理解...

    C# winform 进度条 ProgressBar 带进度显示

    ProgressBar控件通常用于表示一个操作的进度,例如文件复制、下载或处理数据。它有一个可调整的范围值,可以从最小值到最大值,并且可以设置步长来控制每次增加的数值。在设计时,你可以通过属性设置来调整其外观,...

    网页中常用到的用于显示进度的图片

    这些图片通常采用各种图形设计,包括条形进度条、圆形进度环、百分比指示器等形式,旨在清晰地展示加载、上传、下载或其他长时间运行任务的进度。 一、条形进度条 条形进度条是最常见的进度指示器类型,通常由一个...

    Android-Downloaderinjava多线程下载器支持断点下载进度回传

    8. **UI交互**:在Android应用中,下载进度通常会显示在通知栏或者专门的下载界面。开发者需要使用`Notification` API创建下载通知,并更新下载进度。同时,UI界面也需要实时更新下载状态,如暂停、继续、完成或失败...

    圆圈型的显示进度

    进度圆圈应该能根据屏幕尺寸自动调整大小,保持比例,以适应不同设备的显示需求。 6. **无障碍性**:为了保证所有用户都能理解进度,尤其是视力障碍的用户,进度圆圈应当遵循WCAG(Web Content Accessibility ...

    漂亮的进度显示控件

    例如,当后台任务完成一定比例的工作时,可以通过调用接口的方法来更新球形控件的进度。 在具体实现这个控件时,开发者需要考虑性能优化,因为动态的动画可能会对设备性能造成影响。例如,合理地使用硬件加速,避免...

    C#源码在ProgressBar控件中显示进度百分比.zip

    在C#编程中,我们经常使用它来可视化执行长时间任务的进度,如文件上传、下载或处理大量数据。本教程将详细介绍如何在C#中使用ProgressBar控件来显示进度百分比。 首先,我们需要在设计界面中添加一个ProgressBar...

    js圆环进度显示

    //进度比例,0到1,在本例中我们画65% //需要注意,下面的算法不支持画100%,要按99.99%来画 var percent = n , drawPercent = percent &gt;= 1 ? 0.9999 : percent; //开始计算各点的位置,见后图 //r1是...

    易语言进度移动文件模块例子源码,易语言进度移动文件模块

    3. 更新进度:处理每个块后,模块会计算已处理的字节数占总字节数的比例,从而更新进度条的显示。 4. 写入目标文件:读取的块被写入目标位置,直到整个文件完成移动。 5. 错误处理和中断:模块还应包含错误处理机制...

    使用C#在进度条中显示复制文件的进度

    ProgressBar控件用于显示复制进度,Button则触发文件复制操作。 1. **创建进度条和按钮**: 在设计界面时,将ProgressBar控件拖放到窗体上,并设置其Minimum和Maximum属性为0和100,分别代表进度的开始和结束。...

    android 多线程下载,退出后返回后更新组件显示

    本项目显然关注的是如何实现这一功能,并且在用户退出应用后,能够保存下载状态,在重新进入应用时继续下载,并更新UI组件显示下载进度。 首先,我们需要理解多线程的概念。在单线程环境下,如果一个任务在执行,...

    c#开发设计系统启动进度显示

    3. **进度计算与更新**:根据加载任务的复杂性,为每个子任务分配权重,然后在`ProgressChanged`事件中,根据子任务的完成比例更新进度条的`Value`。 4. **反馈信息**:除了进度条,还可以添加文本信息来告知用户...

    java 递归拷贝文件显示进度demo

    这个"java 递归拷贝文件显示进度demo"是一个实用的示例,它不仅实现了从一个源目录到目标目录的深度拷贝,而且还提供了进度显示功能,这对于用户来说是一个很好的交互体验。以下是对这个Demo涉及知识点的详细解释: ...

    VC++6.0文件下载显示下载进度条

    在本教程中,我们将探讨如何使用VC++6.0实现一个文件下载功能,并同时显示下载进度条,这在用户界面设计中是非常重要的,因为它能提供良好的用户体验,让用户了解文件下载的状态。 首先,我们需要理解文件下载的...

    progress的进度显示

    在本例中,"progress的进度显示"主要涉及到的是在上传图片到服务器过程中,如何实时更新并展示已上传部分的比例。 一、HTML5的`&lt;progress&gt;`元素 `&lt;progress&gt;`是HTML5引入的一个新标签,用于创建进度条,它可以清晰...

    取得网络文件尺寸&进度下载.rar

    进度下载主要是指在文件下载过程中实时更新显示已下载的部分与总大小的比例,以让用户了解下载状态。实现这一功能主要涉及以下几个步骤: 1. **初始化下载**:在开始下载前,先获取文件尺寸,然后创建一个空的本地...

    Python代码源码-实操案例-框架案例-如何实现实时显示下载的进度(百分比形式).zip

    3. 进度条:为了显示下载进度,我们需要计算已下载的数据量与总数据量的比例,然后转换为百分比。这通常涉及到循环下载数据块,并在每次迭代中更新进度。 4. 多线程或异步IO:在处理大文件下载时,可以考虑使用多...

Global site tag (gtag.js) - Google Analytics