android下载进度条

SouthWind0 2011-10-14

今天的这段代码是网上找的,自己做了些小改,通过模拟器测试。文件下载进度条控制(就是为了高清壁纸加个进度条),自己研究了好久,但是进度条只能显示缓存写入文件的进度,不能显示下载进度。找了好久,终于找到一段用的代码,所以记录下来,大家分享。

<?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 cn.llc.htmltop;

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 MainActivity 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(MainActivity.this, "文件下载完成", 1).show();

					break;

				case -1:

					String error = msg.getData().getString("error");

					Toast.makeText(MainActivity.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://www.baidu.com/img/baidu_sylogo1.gif",
							"/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);

	}

}

相关推荐