文件下载进度条的问题

android_Y 2012-05-18 05:03:00
我自己做了个文件下载的例子
然后我想加个进度条显示已下载多少
可是进度条只有在下载完成的时候才会显示满了再下载中一直是空的
还有就是当文件稍微大一点就算不出下载的百分比开始一直0%突然下完了就到100%了

package a.a;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class a extends Activity {
Button b;
OutputStream output;// 输入出流
ProgressBar bar;
HandlerThread ht;
myHandler h;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b = (Button) findViewById(R.id.btn);
bar = (ProgressBar) findViewById(R.id.bar);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
// 创建URL 写入下载地址
URL url = new URL(
"http://e.zte.com.cn/pub/bbs/upload/2012/05/11/18688264685914.flv");
// 创建HttpURLConnection
HttpURLConnection urlcon = (HttpURLConnection) url
.openConnection();
// 获得文件大小
long TotalSize = Long.parseLong(urlcon
.getHeaderField("Content-Length"));
// 获得文件大小
int fileLength = urlcon.getContentLength();
// 获得输入流
InputStream is = urlcon.getInputStream();
// 创建目录
File dir = new File("/mnt/sdcard/abc");
dir.mkdir();
// 创建文件
File file = new File("/mnt/sdcard/abc/asd.flv");
// 如果存在则删除
if(file.exists())
file.delete();
// 创建文件
file.createNewFile();
// 创建文件输入流
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
int size = 0;
ht = new HandlerThread("down");
ht.start();
h = new myHandler(ht.getLooper());
bar.setVisibility(View.VISIBLE);
int aaa = fileLength / (1024 * 2);
while((is.read(buffer)) != -1) {
output.write(buffer);
size++;
Message m = h.obtainMessage();
m.arg1 = (size / aaa) * 100;
m.sendToTarget();
}
// 清除缓存
output.flush();
}
catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
try {
// 关闭输出流
output.close();
}
catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}

class myHandler extends Handler {
public myHandler(Looper looper) {
super(looper);
}

boolean VISIBLE = false;

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(!VISIBLE) {
bar.setVisibility(View.VISIBLE);
VISIBLE = true;
}
bar.setProgress(msg.arg1);
}
}
}

求高人讲解下 Handler ,HandlerThread,android UI线程和多线程
...全文
210 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
追风筝的孩子 2012-05-21
  • 打赏
  • 举报
回复
http://www.eoeandroid.com/thread-70013-1-1.html

参照一下
android_Y 2012-05-21
  • 打赏
  • 举报
回复

package a.a;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
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.ProgressBar;

public class a extends Activity {
Button b;
OutputStream output;// 输入出流
ProgressBar bar;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b = (Button) findViewById(R.id.btn);
bar = (ProgressBar) findViewById(R.id.bar);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
down();
}
});
}

Handler handler = new Handler() {

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what) {
case 0:
bar.setVisibility(View.VISIBLE);
break;
case 1:
bar.setProgress(msg.arg1);
break;
}
}
};
//下载方法 必须放在单独的线程里
private void down() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Message m = handler.obtainMessage();
m.what = 0;
m.sendToTarget();
// 创建URL 写入下载地址
URL url = new URL(
"http://e.zte.com.cn/pub/bbs/upload/2012/05/11/18688264685914.flv");
// 创建HttpURLConnection
HttpURLConnection urlcon = (HttpURLConnection) url
.openConnection();
// 获得文件大小
long TotalSize = Long.parseLong(urlcon
.getHeaderField("Content-Length"));
// 获得文件大小
int fileLength = urlcon.getContentLength();
// 获得输入流
InputStream is = urlcon.getInputStream();
// 创建目录
File dir = new File("/mnt/sdcard/abc");
dir.mkdir();
// 创建文件
File file = new File("/mnt/sdcard/abc/asd.flv");
// 如果存在则删除
if(file.exists())
file.delete();
// 创建文件
file.createNewFile();
// 创建文件输入流
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
//已下载
int size = 0;
//把文件分为100份
int each = fileLength / 100;
while((is.read(buffer)) != -1) {
output.write(buffer);
Message m2 = handler.obtainMessage();
m2.what = 1;
size += 2 * 1024;
//提示已下载百分之多少
m2.arg1 = size / each;
m2.sendToTarget();
}
// 清除缓存
output.flush();
}
catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
try {
// 关闭输出流
output.close();
}
catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
}

现在把代码改了
能有进度条,但是下到50%~60%左右就不会动,不下了
怎么回事?
manoel 2012-05-18
  • 打赏
  • 举报
回复
想了解Handler,楼主可以参见这篇帖子。
http://blog.csdn.net/hustpzb/article/details/6031525

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧