求教,使用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吧,也是开线程干活,很好用。
[解决办法]
[解决办法]
[解决办法]
while (DownedFileLength < FileLength) {
if (DownedFileLength + count > F……
sleep(1000)
每次循环暂停一下 每次写count=1024,多打些日志试试
