本文共 2702 字,大约阅读时间需要 9 分钟。
前几天刚把Tomcat服务器搭建好,就开始学习Android 网络编程,在参考了部分资料后,终于实现了网络图片的查看。下面就把整个过程记录一下,方便自己复习,也给需要者提供参考。
点击“下载图片”按钮,实现图片的下载,先看一下效果图:
布局文件很简单,Button和ImageView,就不介绍了。
public void click(View v){ //开启子线程 Thread thread = new Thread(){ @Override public void run() { // TODO Auto-generated method stub super.run(); //前提是搭建Tomcat 确定网址 下载图片 String path ="http://192.168.56.1:8080/sea.jpg"; try { //把网址封装成url对象 URL url = new URL(path); //获取连接对象,不过此时还没有建立连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //初始化 conn.setRequestMethod("GET"); conn.setReadTimeout(10000); conn.setReadTimeout(10000); //发送请求,建立连接 conn.connect(); //响应码为200,说明请求成功 if (conn.getResponseCode() == 200) { //得到返回的数据流 InputStream is = conn.getInputStream(); //读取数据流,构造位图 Bitmap bm = BitmapFactory.decodeStream(is); //构造消息,传递给子线程 Message msg = new Message(); msg.obj = bm; //设置请求成功 标志 msg.what = 1; //发送消息 到主线程 的消息队列中 handler.sendMessage(msg); }else{ Message msg = handler.obtainMessage(); msg.what = 0; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; //开启线程 thread.start(); }
2.子线程要想刷新Ui,需要利用主线程中的Handler处理子线程发过来的消息。
static Handler handler = new Handler(){ //主线程调用,根据子线程的请求,刷新UI @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); // 请求成功或失败 做出处理 switch (msg.what) { case 1: //显示位图 图像 iv.setImageBitmap((Bitmap)msg.obj); break; case 0: Toast.makeText(ma, "请求失败", 0).show(); break; } } };
需要注意的地方:
1.在AndroidManifest.xml中添加网络权限。
2. startup 服务器,即开启Tomcat,测试服务器的正常使用。
3.关于刷新UI的问题:
刷新UI只能在主线程中完成,如果程序写在子线程,是没用的。
要想在子线程中刷新UI,需要使用消息队列机制。
关于子线程刷新ui的问题,有多种方法,可参考其他博主的文章,如
程序源码下载: