Android开发笔记之get请求方式获得网络图片
2016-07-20 16:39
411 查看
获取网络图片
网络图片必须要有网络权限才可以,添加网络权限
请求图片是一个耗时操作,主线程是不允许进行耗时操作的,以免造成ANR,所以我们需要开启一个线程去请求网络图片,获取到图片发送到主线程进行显示
主线程进行图片显示的处理
这个就是我们获取网络图片的三大步,中间的细枝叶我们在慢慢添加
- 添加网络权限,代码如下
-
第二步,子线程去请求获得网络图片
第三步主线程接收到子线程发送过来的消息进行处理显示
———-“
我们去请求图片的时候,一定线验证链接地址是否正确,是否是图片的链接地址,否则其它的一概免谈
网络图片必须要有网络权限才可以,添加网络权限
请求图片是一个耗时操作,主线程是不允许进行耗时操作的,以免造成ANR,所以我们需要开启一个线程去请求网络图片,获取到图片发送到主线程进行显示
主线程进行图片显示的处理
这个就是我们获取网络图片的三大步,中间的细枝叶我们在慢慢添加
- 添加网络权限,代码如下
-
<uses-permission android:name="android.permission.INTERNET"/>
第二步,子线程去请求获得网络图片
/** * 获取网络文本的线程,耗时操作需要在子线程操作 * @author user * */ public class GetPicThread implements Runnable{ private String path = null; //handler --用于将数据放送到主线程中 private Handler hander = null; public GetPicThread(String path, Handler hander) { super(); this.path = path; this.hander = hander; } @Override public void run() { HttpURLConnection conn= null; InputStream is= null; InputStreamReader istr= null; BufferedReader br= null; try { //1.定义一个URL对象 URL url = new URL(path); //2.通过url获取一个HttpURLConnection对象 conn = (HttpURLConnection) url.openConnection(); //3.设置请求方式 conn.setRequestMethod("GET"); //4.设置超时时间 conn.setConnectTimeout(5000); conn.setReadTimeout(5000); //5.判断响应码200 if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { //6.获取到网络输入的字符流 is = conn.getInputStream(); //7.将字节流中获取的图片数据获取出来 //借助位图工厂类的方法,将流转换为图 Bitmap bm = BitmapFactory.decodeStream(is); //8.将获取的数据发送到主线程中去 Message msg = hander.obtainMessage(); msg.what = 0x0001; msg.obj = bm; hander.sendMessage(msg); } //9.释放资源 } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(br != null){ br.close(); } if(istr != null){ istr.close(); } if(is!= null){ is.close(); } if(conn!= null){ conn.disconnect(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第三步主线程接收到子线程发送过来的消息进行处理显示
———-“
public class MainActivity extends Activity { private ImageView main_iv_show; private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg.what == 0x0001) { Bitmap bm = (Bitmap) msg.obj; main_iv_show.setImageBitmap(bm); } return false; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_iv_show = (ImageView) findViewById(R.id.main_image_show); } /** * 定义button的点击监听事件 * 写法格式固定,方法名要参考xml布局中onclick的属性值 * @param v */ public void getPic(View v){ String path = "http://img4.duitang.com/uploads/item/201502/01/20150201163209_NNruz.jpeg"; //创建一个线程对象 GetPicThread gpt = new GetPicThread(path, handler); Thread t = new Thread(gpt); t.start(); } }
我们去请求图片的时候,一定线验证链接地址是否正确,是否是图片的链接地址,否则其它的一概免谈
布局文件如下所示
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.getpic3.MainActivity" > <Button android:id="@+id/main_btn" android:onClick="getPic" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取网络图片"/> <ImageView android:id="@+id/main_image_show" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
相关文章推荐
- 【计算机基础】《计算机网络 自顶向下方法》学习笔记(更新中)
- 稳定的定时循环请求网络接口(可做类似即时通讯或者推送功能)
- Android使用RecyclerView和Picasso实现大规模浏览网络图片(附带缓存技术)
- asp.net Web.config 在不同版本的IIS配置的IHttpHandler的访问路径,以及经典模式和集成模式不同的配置
- Android中OkHttp的使用
- Android网络资料
- 计算机网络基础
- 通过java.net.URLConnection发送HTTP请求的方法
- 每日安全简讯20160720
- Android 让WebView完美支持https双向认证(SSL)
- 异步HTTPHandler的实现
- 网络流24题
- HttpSessionBindingListener接口
- http协议(五)web服务器
- Java安全通信:HTTPS与SSL
- 准备写一个http下载,支持断点下载,多线程下载
- 【TCP/IP详解 卷一:协议】第二章:链路层
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 (转)
- 同步到网络时间服务器
- 强大的 Fresco(加载网络和本地图片)简单使用