总共六个文件,实现一个list,点击后能够下载,并显示进度。
但是每次执行时在后台看到整个文件下载完了,进度条才会更新。。
首先是一个activity,承载list并获取数据。public class MapDownActivity extends Activity {
private ListView list;
private static final String Path = "http://192.168.1.125:8080/MapServer/mapServer.do?para=getMapList";
private MapListAdapter adapter;
private ProgressBar pb; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setMax(100);
pb.setVisibility(View.INVISIBLE); adapter = new MapListAdapter(this, getData(),pb,getApplicationContext());
list = (ListView) findViewById(R.id.listView1);
list.setAdapter(adapter); } private List<MapListItem> getData() {
//节省空间,这里是获取数据的
}
}自定义一个adapter处理list与下载线程之间的通信public class MapListAdapter extends BaseAdapter {
Activity a;
List<MapListItem> values;
MapListControlHandler handler;
private ProgressBar pb;
private Context context; public MapListAdapter(Activity a, List<MapListItem> values,
ProgressBar pb,Context context) {
this.a = a;
this.values = values;
this.pb = pb;
this.context=context;
} public void addItem(MapListItem item) {
values.add(item);
} @Override
public int getCount() {
return values.size();
} @Override
public MapListItem getItem(int arg0) {
return values.get(arg0);
} public void setItem(MapListItem item, int arg0) {
values.set(arg0, item);
notifyDataSetChanged();
} @Override
public long getItemId(int arg0) {
return arg0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = a.getLayoutInflater().inflate(R.layout.maplist, null); TextView tv1 = (TextView) view.findViewById(R.id.mapname);
tv1.setText(values.get(position).getName()); TextView tv2 = (TextView) view.findViewById(R.id.downtext);
tv2.setText(values.get(position).getStatus());
//这样会生成很多handler吧,不知道是不是这儿出的问题 handler=new MapListControlHandler(pb, context);
handler.setItem(values.get(position));
handler.setAdapter(this);
handler.setPosition(position);

tv2.setOnClickListener(new MapDownOnClick(handler)); TextView tv3 = (TextView) view.findViewById(R.id.data);
tv3.setText(values.get(position).getDate()); TextView tv4 = (TextView) view.findViewById(R.id.updata);
tv4.setText(values.get(position).getPro());
return view;
}
}handler的处理部分public void handleMessage(Message msg) {
if (!Thread.currentThread().isInterrupted()) {
switch (msg.what) {
case 0:
Toast.makeText(context, "已加入下载队列", 1).show();
pb.setVisibility(View.VISIBLE);
break;
case 1:
pb.setProgress(msg.arg1);
break;
case 2:
pb.setProgress(100);
pb.setVisibility(View.INVISIBLE);
pb.setProgress(0);
item.setStatus("下载完成");
adapter.setItem(item, position);
break;
default:
break;
}
}
}下载文件部分private void writeToDevice(String content, String name, Handler handler) {
Message message = new Message();
message.what = 0;
handler.sendMessage(message);

OutputStream outputStream;
int DownedFileLength = 0;
String savePathString = mapdir + name + ".000";
Log.i("下载文件------------>", name);
try {
File file = new File(savePathString);
if (!file.exists()) {
file.createNewFile();
} outputStream = new FileOutputStream(file); byte[] buffer = content.getBytes("ISO-8859-1");
int FileLength = buffer.length;
int count = 1024 * 4;
while (DownedFileLength < FileLength) {
if (DownedFileLength + count > FileLength)
count = FileLength - DownedFileLength;
outputStream.write(buffer, DownedFileLength, count); message = new Message();
message.what = 1;
message.arg1 = (int) ((int) DownedFileLength * 100 / FileLength);
handler.sendMessage(message); DownedFileLength += count;
}
outputStream.close();
message = new Message();
message.what = 2;
handler.sendMessage(message);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}点击事件中的线程:Thread thread = new Thread() {
public void run() {
new MapControl().downFile(handler);
}
};
thread.start();

解决方案 »

  1.   

    handler总是在下载完文件后才收到下载进度的message,但是下载开始的message却能准时收到。。
      

  2.   

    handle的用法不对头吧,找个简单的例子先搞清handle的通知机制吧
      

  3.   

    加一些log语句,可以帮助你定位问题,这个代码里面,在下载的while循环里面添加log,输出一些关键的变量信息,比如DownedFileLength的值
             while (DownedFileLength < FileLength) {
                    if (DownedFileLength + count > FileLength)
                        count = FileLength - DownedFileLength;
                    outputStream.write(buffer, DownedFileLength, count);
                    Log.i("cur DownedFileLength = ", DownedFileLength);
                    message = new Message();
                    message.what = 1;
                    message.arg1 = (int) ((int) DownedFileLength * 100 / FileLength);
                    handler.sendMessage(message);
                    DownedFileLength += count;            }
      

  4.   

    我之前在里面加过log,不过输出也是跟不上进度,都是整个过程完成之后,突然出现大量的log信息,不是一条一条的出现的
      

  5.   

    点击每个Item时都会创建一个对应的handler,每个handler都是挂在主线程上的。在下载线程中会有很多
    进度消息传递过来,但是要注意:不是说你把消息一投递到handler的消息队列中它就会立刻执行的,前面有
    说到,handler的消息队列是挂在主线程上的,所以它得等到主线程闲下来才有机会执行。要想实现实时进度条之类的功能,用AsyncTask吧,也是开线程干活,很好用。
      

  6.   


    因为下载是在单独线程,而且sendmessage不保证立即执行,只是送到消息队列,极有可能出现你说的现象。把下载线程的优先级降低一下。让ui线程有机会处理。
      

  7.   


    另外,从代码来看,你所谓的下载函数只是将string字符串保存到文件,这个过程极短,瞬间就完成。这个因素也是造成你看不到每一次循环更新的原因。如果你的while循环包含真正的下载过程,而且有一定时间才能完成,比如10s左右。估计效果应该能很明显了。
      

  8.   

    while (DownedFileLength < FileLength) {
    if (DownedFileLength + count > F……
    sleep(1000)每次循环暂停一下 每次写count=1024,多打些日志试试
      

  9.   

    我在handler里面加入log:case 1:
    pb.setProgress(msg.arg1);
    Log.i("Handler------------->", msg.arg1+"");
    break;在while里面加入log:handler.sendMessage(message);
    Log.i("------------->", message.arg1+"");
    DownedFileLength += count;结果如下:
    04-11 09:10:38.508: D/dalvikvm(1550): GC_FOR_MALLOC freed 5007 objects / 307280 bytes in 537ms
    04-11 09:10:42.398: D/dalvikvm(1550): GC_FOR_MALLOC freed 1858 objects / 125472 bytes in 97ms
    04-11 09:10:42.529: D/dalvikvm(1550): GC_FOR_MALLOC freed 75 objects / 36064 bytes in 112ms
    04-11 09:10:42.698: D/dalvikvm(1550): GC_FOR_MALLOC freed 44 objects / 67592 bytes in 135ms
    04-11 09:10:42.718: I/dalvikvm-heap(1550): Grow heap (frag case) to 3.329MB for 262160-byte allocation
    04-11 09:10:42.938: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 223ms
    04-11 09:10:43.098: D/dalvikvm(1550): GC_FOR_MALLOC freed 84 objects / 134920 bytes in 105ms
    04-11 09:10:43.121: I/dalvikvm-heap(1550): Grow heap (frag case) to 3.704MB for 524304-byte allocation
    04-11 09:10:43.308: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 187ms
    04-11 09:10:43.478: D/dalvikvm(1550): GC_FOR_MALLOC freed 164 objects / 269576 bytes in 103ms
    04-11 09:10:43.508: I/dalvikvm-heap(1550): Grow heap (frag case) to 4.454MB for 1048592-byte allocation
    04-11 09:10:43.698: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 185ms
    04-11 09:10:44.599: D/dalvikvm(1550): GC_FOR_MALLOC freed 340 objects / 539872 bytes in 429ms
    04-11 09:10:44.712: I/dalvikvm-heap(1550): Grow heap (frag case) to 5.954MB for 2097168-byte allocation
    04-11 09:10:44.848: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 141ms
    04-11 09:10:47.978: D/dalvikvm(1550): GC_FOR_MALLOC freed 694 objects / 1080544 bytes in 262ms
    04-11 09:10:48.198: I/dalvikvm-heap(1550): Grow heap (frag case) to 8.954MB for 4194320-byte allocation
    04-11 09:10:48.488: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 273ms
    04-11 09:10:50.289: D/dalvikvm(1550): GC_FOR_MALLOC freed 325 objects / 2112008 bytes in 171ms
    04-11 09:10:50.298: I/dalvikvm-heap(1550): Grow heap (frag case) to 9.426MB for 2592306-byte allocation
    04-11 09:10:50.450: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 146ms
    04-11 09:10:50.458: I/下载文件------------>(1550): map0
    04-11 09:10:50.749: D/dalvikvm(1550): GC_FOR_MALLOC freed 46 objects / 4196344 bytes in 176ms
    04-11 09:10:50.797: I/------------->(1550): 0
    04-11 09:10:50.797: I/------------->(1550): 0
    04-11 09:10:50.808: I/------------->(1550): 0
    04-11 09:10:50.818: I/------------->(1550): 0
    04-11 09:10:50.848: I/------------->(1550): 1
    04-11 09:10:50.848: I/------------->(1550): 1
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.898: I/Handler------------->(1550): 1
    04-11 09:10:50.898: I/------------->(1550): 1
    04-11 09:10:50.898: I/------------->(1550): 2
    04-11 09:10:50.898: I/------------->(1550): 2
    04-11 09:10:50.919: I/Handler------------->(1550): 1
    04-11 09:10:50.919: I/Handler------------->(1550): 1
    04-11 09:10:50.927: I/------------->(1550): 2
    04-11 09:10:50.927: I/------------->(1550): 3
    04-11 09:10:50.940: I/------------->(1550): 3
    04-11 09:10:50.940: I/------------->(1550): 3
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 5
    04-11 09:10:50.979: I/------------->(1550): 5
    04-11 09:10:50.988: I/------------->(1550): 5
    04-11 09:10:50.988: I/------------->(1550): 6
    04-11 09:10:51.007: I/------------->(1550): 6
    04-11 09:10:51.007: I/------------->(1550): 6
    04-11 09:10:51.020: I/------------->(1550): 6
    04-11 09:10:51.020: I/------------->(1550): 7
    04-11 09:10:51.020: I/------------->(1550): 7
    04-11 09:10:51.047: I/------------->(1550): 7
    04-11 09:10:51.047: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 10
    04-11 09:10:51.098: I/------------->(1550): 10
    04-11 09:10:51.098: I/------------->(1550): 10
    04-11 09:10:51.118: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 12
    04-11 09:10:51.138: I/------------->(1550): 12
    04-11 09:10:51.138: I/------------->(1550): 12
    04-11 09:10:51.148: I/------------->(1550): 12
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.177: I/------------->(1550): 14
    04-11 09:10:51.177: I/------------->(1550): 14
    04-11 09:10:51.189: I/------------->(1550): 14
    04-11 09:10:51.199: I/------------->(1550): 15
    04-11 09:10:51.199: I/------------->(1550): 15
    04-11 09:10:51.228: I/------------->(1550): 15
    04-11 09:10:51.228: I/------------->(1550): 16
    04-11 09:10:51.279: I/------------->(1550): 16
    04-11 09:10:51.279: I/------------->(1550): 16
    04-11 09:10:51.297: I/------------->(1550): 17
    04-11 09:10:51.368: I/------------->(1550): 17
    04-11 09:10:51.398: I/------------->(1550): 17
    04-11 09:10:51.408: I/------------->(1550): 18
    04-11 09:10:51.448: I/------------->(1550): 18
    04-11 09:10:51.448: I/------------->(1550): 18
    04-11 09:10:51.500: I/------------->(1550): 18
    04-11 09:10:51.518: I/------------->(1550): 19
    04-11 09:10:51.547: I/------------->(1550): 19
    04-11 09:10:51.547: I/------------->(1550): 19
    04-11 09:10:51.598: I/------------->(1550): 20
    04-11 09:10:51.618: I/------------->(1550): 20
    04-11 09:10:51.648: I/Handler------------->(1550): 2
    04-11 09:10:51.648: I/Handler------------->(1550): 2
    04-11 09:10:51.678: I/Handler------------->(1550): 2
    04-11 09:10:51.690: I/Handler------------->(1550): 3
    04-11 09:10:51.690: I/------------->(1550): 20
    04-11 09:10:51.698: I/------------->(1550): 21
    04-11 09:10:51.729: I/Handler------------->(1550): 3
    04-11 09:10:51.729: I/Handler------------->(1550): 3
    04-11 09:10:51.729: I/Handler------------->(1550): 4前一部分是系统接收数据的log,可以看到,接受完数据之后才执行了我自己的log,而且理想的log应该是两个互相穿插
      

  10.   

    我在handler里面加入log:case 1:
    pb.setProgress(msg.arg1);
    Log.i("Handler------------->", msg.arg1+"");
    break;在while里面加入log:handler.sendMessage(message);
    Log.i("------------->", message.arg1+"");
    DownedFileLength += count;结果如下:
    04-11 09:10:38.508: D/dalvikvm(1550): GC_FOR_MALLOC freed 5007 objects / 307280 bytes in 537ms
    04-11 09:10:42.398: D/dalvikvm(1550): GC_FOR_MALLOC freed 1858 objects / 125472 bytes in 97ms
    04-11 09:10:42.529: D/dalvikvm(1550): GC_FOR_MALLOC freed 75 objects / 36064 bytes in 112ms
    04-11 09:10:42.698: D/dalvikvm(1550): GC_FOR_MALLOC freed 44 objects / 67592 bytes in 135ms
    04-11 09:10:42.718: I/dalvikvm-heap(1550): Grow heap (frag case) to 3.329MB for 262160-byte allocation
    04-11 09:10:42.938: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 223ms
    04-11 09:10:43.098: D/dalvikvm(1550): GC_FOR_MALLOC freed 84 objects / 134920 bytes in 105ms
    04-11 09:10:43.121: I/dalvikvm-heap(1550): Grow heap (frag case) to 3.704MB for 524304-byte allocation
    04-11 09:10:43.308: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 187ms
    04-11 09:10:43.478: D/dalvikvm(1550): GC_FOR_MALLOC freed 164 objects / 269576 bytes in 103ms
    04-11 09:10:43.508: I/dalvikvm-heap(1550): Grow heap (frag case) to 4.454MB for 1048592-byte allocation
    04-11 09:10:43.698: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 185ms
    04-11 09:10:44.599: D/dalvikvm(1550): GC_FOR_MALLOC freed 340 objects / 539872 bytes in 429ms
    04-11 09:10:44.712: I/dalvikvm-heap(1550): Grow heap (frag case) to 5.954MB for 2097168-byte allocation
    04-11 09:10:44.848: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 141ms
    04-11 09:10:47.978: D/dalvikvm(1550): GC_FOR_MALLOC freed 694 objects / 1080544 bytes in 262ms
    04-11 09:10:48.198: I/dalvikvm-heap(1550): Grow heap (frag case) to 8.954MB for 4194320-byte allocation
    04-11 09:10:48.488: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 273ms
    04-11 09:10:50.289: D/dalvikvm(1550): GC_FOR_MALLOC freed 325 objects / 2112008 bytes in 171ms
    04-11 09:10:50.298: I/dalvikvm-heap(1550): Grow heap (frag case) to 9.426MB for 2592306-byte allocation
    04-11 09:10:50.450: D/dalvikvm(1550): GC_FOR_MALLOC freed 0 objects / 0 bytes in 146ms
    04-11 09:10:50.458: I/下载文件------------>(1550): map0
    04-11 09:10:50.749: D/dalvikvm(1550): GC_FOR_MALLOC freed 46 objects / 4196344 bytes in 176ms
    04-11 09:10:50.797: I/------------->(1550): 0
    04-11 09:10:50.797: I/------------->(1550): 0
    04-11 09:10:50.808: I/------------->(1550): 0
    04-11 09:10:50.818: I/------------->(1550): 0
    04-11 09:10:50.848: I/------------->(1550): 1
    04-11 09:10:50.848: I/------------->(1550): 1
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.887: I/Handler------------->(1550): 0
    04-11 09:10:50.898: I/Handler------------->(1550): 1
    04-11 09:10:50.898: I/------------->(1550): 1
    04-11 09:10:50.898: I/------------->(1550): 2
    04-11 09:10:50.898: I/------------->(1550): 2
    04-11 09:10:50.919: I/Handler------------->(1550): 1
    04-11 09:10:50.919: I/Handler------------->(1550): 1
    04-11 09:10:50.927: I/------------->(1550): 2
    04-11 09:10:50.927: I/------------->(1550): 3
    04-11 09:10:50.940: I/------------->(1550): 3
    04-11 09:10:50.940: I/------------->(1550): 3
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 4
    04-11 09:10:50.967: I/------------->(1550): 5
    04-11 09:10:50.979: I/------------->(1550): 5
    04-11 09:10:50.988: I/------------->(1550): 5
    04-11 09:10:50.988: I/------------->(1550): 6
    04-11 09:10:51.007: I/------------->(1550): 6
    04-11 09:10:51.007: I/------------->(1550): 6
    04-11 09:10:51.020: I/------------->(1550): 6
    04-11 09:10:51.020: I/------------->(1550): 7
    04-11 09:10:51.020: I/------------->(1550): 7
    04-11 09:10:51.047: I/------------->(1550): 7
    04-11 09:10:51.047: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 8
    04-11 09:10:51.078: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 9
    04-11 09:10:51.087: I/------------->(1550): 10
    04-11 09:10:51.098: I/------------->(1550): 10
    04-11 09:10:51.098: I/------------->(1550): 10
    04-11 09:10:51.118: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 11
    04-11 09:10:51.128: I/------------->(1550): 12
    04-11 09:10:51.138: I/------------->(1550): 12
    04-11 09:10:51.138: I/------------->(1550): 12
    04-11 09:10:51.148: I/------------->(1550): 12
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.158: I/------------->(1550): 13
    04-11 09:10:51.177: I/------------->(1550): 14
    04-11 09:10:51.177: I/------------->(1550): 14
    04-11 09:10:51.189: I/------------->(1550): 14
    04-11 09:10:51.199: I/------------->(1550): 15
    04-11 09:10:51.199: I/------------->(1550): 15
    04-11 09:10:51.228: I/------------->(1550): 15
    04-11 09:10:51.228: I/------------->(1550): 16
    04-11 09:10:51.279: I/------------->(1550): 16
    04-11 09:10:51.279: I/------------->(1550): 16
    04-11 09:10:51.297: I/------------->(1550): 17
    04-11 09:10:51.368: I/------------->(1550): 17
    04-11 09:10:51.398: I/------------->(1550): 17
    04-11 09:10:51.408: I/------------->(1550): 18
    04-11 09:10:51.448: I/------------->(1550): 18
    04-11 09:10:51.448: I/------------->(1550): 18
    04-11 09:10:51.500: I/------------->(1550): 18
    04-11 09:10:51.518: I/------------->(1550): 19
    04-11 09:10:51.547: I/------------->(1550): 19
    04-11 09:10:51.547: I/------------->(1550): 19
    04-11 09:10:51.598: I/------------->(1550): 20
    04-11 09:10:51.618: I/------------->(1550): 20
    04-11 09:10:51.648: I/Handler------------->(1550): 2
    04-11 09:10:51.648: I/Handler------------->(1550): 2
    04-11 09:10:51.678: I/Handler------------->(1550): 2
    04-11 09:10:51.690: I/Handler------------->(1550): 3
    04-11 09:10:51.690: I/------------->(1550): 20
    04-11 09:10:51.698: I/------------->(1550): 21
    04-11 09:10:51.729: I/Handler------------->(1550): 3
    04-11 09:10:51.729: I/Handler------------->(1550): 3
    04-11 09:10:51.729: I/Handler------------->(1550): 4前一部分是系统接收数据的log,可以看到,接受完数据之后才执行了我自己的log,而且理想的log应该是两个互相穿插
      

  11.   

    我觉得前面接收数据部分应该是我的服务器端的问题,我服务器端是直接把文件读成字符流,然后用response直接write出去的,所以我的接收端只能全部接受完之后再处理。。因此集中处理大量字符串导致进程过于繁忙,因而使消息产生延迟。。我加了sleep之后日志输出顺序正确了。。