Android中设置进度条来监督下载进程
昨天做了一个Android中利用进度条来监督下载一个图片或者一首歌曲的进度:
简单的界面,但是可以实现那个功能:
这是main.xml中的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#FFFF37"
android:text="下载进度" />
<Button
android:id="@+id/downImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_style"
android:text="开始下载图片" />
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imgView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="fill_parent"
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="invisible" />
</FrameLayout>
</LinearLayout>
这里是drawable里面去实现button点击的按钮样式的:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape>
<gradient android:startColor="#0d76e1" android:endColor="#0d76e1"
android:angle="270" />
<stroke android:width="1dip" android:color="#f403c9" />
<corners android:radius="2dp" />
<padding android:left="10dp" android:top="10dp"
android:right="10dp" android:bottom="10dp" />
</shape>
</item>
<item android:state_focused="true">
<shape>
<gradient android:startColor="#ffc2b7" android:endColor="#ffc2b7"
android:angle="270" />
<stroke android:width="1dip" android:color="#f403c9" />
<corners android:radius="2dp" />
<padding android:left="10dp" android:top="10dp"
android:right="10dp" android:bottom="10dp" />
</shape>
</item>
<item>
<shape>
<gradient android:startColor="#000000" android:endColor="#ffffff"
android:angle="180" />
<stroke android:width="1dip" android:color="#f403c9" />
<corners android:radius="5dip" />
<padding android:left="10dp" android:top="10dp"
android:right="10dp" android:bottom="10dp" />
</shape>
</item>
</selector>
接下来的这个就是实现其功能的主要代码:.java文件
package cn.android.app.hsd;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class Chapter_11_URL_exampleActivity extends Activity implements OnClickListener {
// 声明视图上的各个对象
private TextView txtView;
private Button downImg;
private ImageView imgView;
// 定义一个ProgressBar控件,用于显示下载的进度
private ProgressBar progressBar;
private Bitmap bitmap;
// 定义下载任务的状态,下载中,下载完成
private static final int LOADING = 1;
private static final int END = 2;
//初始化进度条的最大值和最小值
int maxSize = 0;
int nowSize = 0;
Handler handler;
// 把图片写入到sd卡中,所以这里我们要定义一个路径
private static final String SDCARD = "mnt/sdcard/";
private String fileName = "networkImg.jpg";
//声明一个文件,待会用于存储
File file;
//设置图片的url,这里的url是在网上随便找到一张图片,然后点击起链接
String imgHttp1 = "http://c.hiphotos.baidu.com/image/w%3D2048/sign=f1e49b68aa64034f0fcdc5069bfb7831/060828381f30e9240286c9844d086e061d95f761.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//然后将这些控件都实例化
txtView = (TextView) findViewById(R.id.txt);
downImg = (Button) findViewById(R.id.downImg);
//将按钮控件实现监听
downImg.setOnClickListener(this);
imgView = (ImageView) findViewById(R.id.imgView);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
//注意这里我们要涉及到更新ui界面,我们不能直接去更新,这就是java与android的区别,所以,我们要记住用handler
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (null != progressBar) {
// 设置进度条最大值
progressBar.setMax(maxSize);
// 当前已经下载的值
nowSize += msg.getData().getInt("loadingSize");
// 设置进度条的当前进度值
progressBar.setProgress(nowSize);
if (msg.what == LOADING) {
// 显示已经下载的值(这里会有一点计算)
txtView.setText("已下载:" + (nowSize*100)/maxSize + "%");
Log.e("Chapter_11_URL_exampleActivity", "正在下载:"+ nowSize);
}
if (msg.what == END) {
// 下载完成后隐藏进度条
progressBar.setVisibility(View.INVISIBLE);
// 显示图片
imgView.setImageBitmap(bitmap);
// 将图片保存到sdcard中
saveImg(SDCARD + fileName, bitmap);
// 结束当前线程
Thread.currentThread().interrupt();
}
}
}
};
}
//实现其点击事件
@Override
public void onClick(View paramView) {
// 首先清空图片和进度条
if (null != bitmap) {
imgView.setImageBitmap(null);
nowSize = 0;
progressBar.setProgress(0);
txtView.setText("即将下载......");
}
// 1、显示进度条
progressBar.setVisibility(View.VISIBLE);
// 2、开始下载
new MyThread(imgHttp1).start();
}
// 保存图片方法
public void saveImg(String fullPath, Bitmap bitmap) {
File file = new File(fullPath);
if (file.exists()) {
file.delete();
} else if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
FileOutputStream fos = new FileOutputStream(file);
boolean isSaved = bitmap.compress(Bitmap.CompressFormat.JPEG, 100,fos);
if (isSaved) {
fos.flush();
fos.close();
}
System.out.println("文件保存成功!");
} catch (FileNotFoundException e) {
System.out.println("保存失败(FileNotFoundException)");
e.printStackTrace();
} catch (IOException e) {
System.out.println("保存失败(IOException)");
e.printStackTrace();
}
}
class MyThread extends Thread {
String httpImg;
//定义构造方法用来接收图片
public MyThread(String httpImg) {
this.httpImg = httpImg;
}
@Override
public void run() {
//(字节数组流)捕获内存缓冲区的数据,转换成字节数组
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
// 实例化URL对象,指定资源(图片)下载的地址
URL url = new URL(httpImg);
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
con.setDoInput(true);
con.connect();
InputStream is = con.getInputStream();
// 获取文件的大小
maxSize = con.getContentLength();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
bos.flush();
// 发送消息
Message msg = new Message();
msg.what = LOADING;
Bundle bundle = new Bundle();
bundle.putInt("loadingSize", len);
msg.setData(bundle);
Thread.sleep(1);//方法休眠20
handler.sendMessage(msg);
}
// 关闭输入流
is.close();
// 关闭连接
con.disconnect();
byte[] imgBytes = bos.toByteArray();
bitmap = BitmapFactory.decodeByteArray(imgBytes, 0,imgBytes.length);
// 下载结束后发送消息
Message msg = new Message();
msg.what = END;
handler.sendMessage(msg);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}