网络查看图片
2015-07-03 14:07
676 查看
public void viewImage(View view) { String path=etImageUrl.getText().toString();//把图片路径转换成字符串 if(TextUtils.isEmpty(path)) { /* * question:对于一个UI界面中,当判断用户是否输入用户名或密码时,我们常用TextUtils.isEmpty()方法来判断;但有时也可以用这个equals()方法,都可以来判断EditText中是否为空,但有时很纠结,不知道这两种方法中哪个比较好?为什么?*/ answer:仔细读官方的API: Returns true if the string is null or 0-length. 因为你从EditText返回的是一个变量。如果这个变量本身为null值,那么你掉它的equals方法是要报错的。但是如果你调用TextUtils.isEmpty() 把这个变量作为参数传进去。 只要这个参数为空或者为"",都会返回真。所以,用官方给的更加严谨。而且,也十分方便。因为你单独去判断你还不是要写一个if语句判断。返回的还是一个boolean值*/ Toast.makeText(this, R.string.NOnull, Toast.LENGTH_LONG).show();//如果输入路径为空,就弹出Toast }else{ //不为空,连接服务器,请求获得图片 try{ URL url=new URL(path); //发出http请求 HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET");//设置提交方式 //设置连接超时时间 httpURLConnection.setConnectTimeout(5000);//这时,我们设置为超时时间为5秒,如果5秒内不能连接就被认为是有错误发生. int responsecode=httpURLConnection.getResponseCode(); if(responsecode==200){ InputStream inputstream=httpURLConnection.getInputStream(); Bitmap bitmap=BitmapFactory.decodeStream(inputstream); ivImage.setImageBitmap(bitmap); }else{ Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show(); } }catch(MalformedURLException e){ e.printStackTrace(); }catch(IOException E){ E.printStackTrace(); } }
UI线程
说了那么多的UI线程,那么哪些属于UI线程呢?
UI线程主要包括如下:
Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
Mainthread handler: handleMessage(), post*(runnable r), etc
所以,应该对该算法进行改进,这就引入了线程的概念,关于线程,在ASP.NET或者java中应该都有详细解释。下面不再进行详细赘余。
什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。
什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
什么是多线程? 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处: 可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
多线程的不利方面: 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题; 线程太多会导致控制太复杂,最终可能造成很多Bug。
改进后的程序:(采用的是匿名内部类的方法)
public void viewImage(View view){ final String imageUrl=etImageUrl.getText().toString(); if(TextUtils.isEmpty(imageUrl)){ Toast.makeText(this, "图片路径不能为空", Toast.LENGTH_LONG).show(); }else{ new Thread(){ public void run() { try { //在处理的过程中,必须进行异常处理 URL url=new URL(imageUrl); HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); int responseCode=httpURLConnection.getResponseCode(); if(responseCode==200){ InputStream inputStream=httpURLConnection.getInputStream(); Bitmap bitmap=BitmapFactory.decodeStream(inputStream); Message message=new Message(); message.what=SHOWIMAGE; message.obj=bitmap; //ivImage.setImageBitmap(bitmap); handler.sendMessage(message); }else{ Toast.makeText(MainActivity.this, "显示图片失败", Toast.LENGTH_LONG).show(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
在文本框中输入图片的路径,点击浏览按钮的同时,将会在上方的ImageView中显示出来该图片。
想要实现上面的程序,需要在按钮的点击事件中,在MainActivity的初始代码:
相关文章推荐
- Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
- 去除asp.net 2.0的会话cookie ASP.NET_SessionId 的httponly属性
- 常用Web开发语言HttpOnly设置详解
- C#中HttpClient使用注意:预热与长连接
- 监听网络状态
- 查看网络图片
- receiver 修改可以用http访问
- iOS开发网络篇之Web Service和XML数据解析
- Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的
- <%@page contentType="text/html;charset=gbk"%>与<meta http-equiv="Content-Type" content="text/html; ch
- php://input 和$_POST和$GLOBALS['HTTP_RAW_POST_DATA']的简单区别
- 连接监听器:接受TCP连接 (十一) (转)
- TCP传输数据初探
- 聊聊HTTPS与Android安全(二)
- HttpMessageConverter(消息转换器 )和@responsebody使用
- SpringMVC DELETE,PUT请求报错 添加支持Http的DELETE、PUT请求
- iOS开发网络篇之Base64编解码
- 关于Bayes网络新解
- Ubuntu 14.04 下搭建SVN服务器 (转载自 http://www.linuxidc.com/Linux/2015-01/111956.htm)-------------我所用到是红色字体
- 查看网络图片