总共六个文件,实现一个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(); } }