更新进度条

有些地方需要用到像下载时用到的进度条,我这里简单的做了个demo。

布局文件activity_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"
android:padding="10dp">
<Button
android:id="@+id/btnAddPro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加进程"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/llPro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</ScrollView>
</LinearLayout>

接着就是往llPro中添加view,view的布局unit_process.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">

<TextView
android:id="@+id/tv_rate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="" />
<TextView
android:id="@+id/tv_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

<ProgressBar
android:id="@+id/down_pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100" />
</LinearLayout>

代码实现:
package com.lml.process;

import java.io.File;
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.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

Button btnAdd;
LinearLayout llPro;
private int num=0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llPro=(LinearLayout)findViewById(R.id.llPro);

btnAdd=(Button)findViewById(R.id.btnAddPro);

btnAdd.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
final View view = inflater.inflate(R.layout.unit_process, null);
llPro.addView(view);
String source = "http://image.baidu.com/i?tn=download&ipn=dwnl&word=%E5%9B%BE%E7%89%87%E4%B8%8B%E8%BD%BD&ie=utf-8&fr=result&url=http%3A%2F%2Fimg2.pcpop.com%2FArticleImages%2F0x0%2F1%2F1061%2F001061672.jpg";
AsyTask at=new AsyTask(MainActivity.this,view,source);
at.execute();
}
});


}

private Handler handler = new Handler() {
ProgressBar pb;
TextView tv_rate,tv_name;
@Override
public void handleMessage(Message msg) {
// 定义一个Handler,用于处理下载线程与UI间通讯
if (!Thread.currentThread().isInterrupted()) {
Object[] data= (Object[])(msg.obj);
View view =(View) data[0];
switch (msg.what) {
case 0:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_name=(TextView)view.findViewById(R.id.tv_name);

pb.setMax((Integer)data[1]);
tv_name.setText((String)data[2]);
break;
case 1:
pb=(ProgressBar)view.findViewById(R.id.down_pb);
tv_rate=(TextView)view.findViewById(R.id.tv_rate);

pb.setProgress((Integer)data[2]);
int result = (Integer)data[2] * 100 /(Integer) data[1];
tv_rate.setText(result + "%");
break;
case 2:
Toast.makeText(MainActivity.this, "文件下载完成", Toast.LENGTH_SHORT).show();
break;

case -1:
String error = msg.getData().getString("error");
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
break;
}
}
super.handleMessage(msg);
}
};

public boolean downFile(String url, String path , View view) throws IOException {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();

URL absUrl = conn.getURL();// 获得真实Url
String filename = conn.getHeaderField("Content-Disposition");
if (filename == null || filename.length() < 1) {
filename = absUrl.getFile();
}


int fileSize = conn.getContentLength();// 根据响应获取文件大小
if (fileSize <= 0)
return false;
if (is == null)
return false;

File dir=new File(path+"/Mytext");
dir.mkdirs();
File file=new File(dir.getAbsolutePath(),"lml"+(num++)+".jpg");
if(file.exists()){
file.delete();
}
file.createNewFile();

FileOutputStream fos = new FileOutputStream(file);

byte buf[] = new byte[1024];
int downLoadFileSize = 0;
Object[] data0=new Object[]{view,fileSize,filename };
sendMsg(0,data0);
do {
// 循环读取
int numread = is.read(buf);
if (numread == -1) {
break;
}
fos.write(buf, 0, numread);
downLoadFileSize += numread;

Object[] data1=new Object[]{view,fileSize,downLoadFileSize };
sendMsg(1,data1);// 更新进度条
} while (true);

Object[] data1=new Object[]{view};
sendMsg(2,data1);// 通知下载完成
try {
is.close();
fos.close();
} catch (Exception ex) {
return false;
}
return true;
}

private void sendMsg(int flag,Object[] data) {
Message msg = Message.obtain(handler,flag, 0, 0,data);
handler.sendMessage(msg);
}

class AsyTask extends AsyncTask<String, Integer, Boolean> {

Context mContext;
View view;
String source;

public AsyTask(Context context,View view,String source) {
mContext = context;
this.view=view ;
this.source=source;
}

@Override
protected void onPreExecute() {
super.onPreExecute();

}

@Override
protected Boolean doInBackground(String... arg0) {
Boolean isSuccess = false ;
try {
isSuccess = downFile(source,
Environment.getExternalStorageDirectory().getPath(),view);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return isSuccess;
}

@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if(!result){
llPro.removeView(view);
Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_LONG).show();
}

}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值