求教,使用handler刷新list的有关问题

求教,使用handler刷新list的问题总共六个文件,实现一个list,点击后能够下载,并显示进度。但是每次执行时在

求教,使用handler刷新list的问题
总共六个文件,实现一个list,点击后能够下载,并显示进度。
但是每次执行时在后台看到整个文件下载完了,进度条才会更新。。
首先是一个activity,承载list并获取数据。

Java code
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与下载线程之间的通信
Java code
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的处理部分
Java code
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;            }        }    }

下载文件部分
Java code
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();        }    } 


点击事件中的线程:
Java code
Thread thread = new Thread() {                public void run() {                    new MapControl().downFile(handler);                }            };            thread.start();


[解决办法]
线程里面sleep一下看看
[解决办法]
handle的用法不对头吧,找个简单的例子先搞清handle的通知机制吧
[解决办法]
加一些log语句,可以帮助你定位问题,这个代码里面,在下载的while循环里面添加log,输出一些关键的变量信息,比如DownedFileLength的值
Java code
         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;            }
[解决办法]
点击每个Item时都会创建一个对应的handler,每个handler都是挂在主线程上的。在下载线程中会有很多
进度消息传递过来,但是要注意:不是说你把消息一投递到handler的消息队列中它就会立刻执行的,前面有
说到,handler的消息队列是挂在主线程上的,所以它得等到主线程闲下来才有机会执行。

要想实现实时进度条之类的功能,用AsyncTask吧,也是开线程干活,很好用。

[解决办法]
探讨

引用:
加一些log语句,可以帮助你定位问题,这个代码里面,在下载的while循环里面添加log,输出一些关键的变量信息,比如DownedFileLength的值

Java code


while (DownedFileLength < FileLength) {
if (DownedFileLength + count > FileLen……

我之前在……

[解决办法]
探讨

引用:

引用:
加一些log语句,可以帮助你定位问题,这个代码里面,在下载的while循环里面添加log,输出一些关键的变量信息,比如DownedFileLength的值

Java code


while (DownedFileLength < FileLength) {
if (DownedFileLength + count > F……

[解决办法]
while (DownedFileLength < FileLength) {
if (DownedFileLength + count > F……
sleep(1000)

每次循环暂停一下 每次写count=1024,多打些日志试试