Android加载网络图片大致可以分为两种,低版本的和高版本的。低版本比如4.0一下或者更低版本的API直接利用Http就能实现了:

1.main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/imagepath" /> <EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="http://10.191.92.7:8080/web/xiaoxiao.jpg"
android:id="@+id/imagepath"/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button" android:id="@+id/button"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"/> </LinearLayout>

2.MainActivity.java

package ygc.yxb.image;

import ygc.yxb.service.ImageService;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends Activity {
private EditText pathText;
private ImageView imageView; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得图片路径
pathText=(EditText) this.findViewById(R.id.imagepath);
//获得要显示的imageView
imageView=(ImageView) this.findViewById(R.id.imageView);
//获得button按钮
Button button=(Button) this.findViewById(R.id.button); //注册button按钮的点击事件
button.setOnClickListener(new ButtonClickListener()); } private final class ButtonClickListener implements View.OnClickListener{ @Override
public void onClick(View v) {
String path=pathText.getText().toString();
try {
//业务逻辑层:ImageService类的getImage方法用以获取网络图片
byte[] data = ImageService.getImage(path);
//用字节数组所有信息生成位图对象
Bitmap bitmap =BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bitmap);//显示图片
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.error, 1).show();
} } }
}

3.ImageService.java

package ygc.yxb.service;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; import ygc.yxb.utils.StreamTool; public class ImageService { /**
* 获取网络图片的数据
* @param path 网络图片路径
* @return
*/
public static byte[] getImage(String path) throws Exception { URL url = new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection(); //基于HTTP协议的连接对象
conn.setConnectTimeout(5000);//5秒
conn.setRequestMethod("GET");//请求方式
//判断请求是否成功
if(conn.getResponseCode()==200){
//定义输入流
InputStream inStream = conn.getInputStream();
return StreamTool.read(inStream); } return null;
} }

4.StreamTool.java 输入流工具类。

package ygc.yxb.utils;

import java.io.ByteArrayOutputStream;
import java.io.InputStream; public class StreamTool { /**
* 读取流中的数据
* @param inStream
* @return
* @throws Exception
*/
public static byte[] read(InputStream inStream) throws Exception {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
//如果字节流中的数据不等于-1,就说明一直有,然后循环读出
while( (len=inStream.read(buffer)) !=-1){
//将读出的数据放入内存中
outputStream.write(buffer); }
inStream.close();
return outputStream.toByteArray();
} }

5.AndroidManifest.xml 在清单文件配置访问网络的权限。

<!-- 访问internet权限 -->
   <uses-permission android:name="android.permission.INTERNET"/>

而如果4.0或者以上版本的话就不能直接获取图片了,直接获取网络图片就会报出android.os.NetworkOnMainThreadException异常,因为4.0以上访问网络的功能不能发生在主线程中运行,而如果把上面访问方式改为异步操作就不会出现在4.0上访问报出 android.os.NetworkOnMainThreadException异常了。

如添加一个异步类,将原来(上文)在activity的onclick中执行的事件放到这里面

import com.hello.db.R;
import com.hello.service.ImageService; import android.database.CursorJoiner.Result;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import android.widget.Toast; public class ImageAsync extends AsyncTask<String, Bitmap, Bitmap> {//三个参数:第一个参数表示指定doInBackGround()方法中的参数类型,第二个参数表示指定OnPostExcut //e()方法中的参数类型,第三个参数表示doInbackGround()方法的返回值类型,必须与OnPostExcute()/ //方法的参数类型相同。(仅为个人理解,错误之处还请各位大神指出…谢啦)
private ImageView imageView; public ImageAsync(ImageView imageView) {
this.imageView = imageView;
} @Override
protected Bitmap doInBackground(String... params) {
String ipath = params[0];
Bitmap bitmap=null;
try{ byte[] data=ImageService.getImage(ipath); bitmap=BitmapFactory.decodeByteArray(data, 0, data.length); } catch(Exception e){
e.printStackTrace(); } return bitmap;
} @Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
imageView.setImageBitmap(result);
}
}

Android加载网络图片报android.os.NetworkOnMainThreadException异常的更多相关文章

  1. Android加载网络图片学习过程

    好多应用,像我们公司的<乘友>还有其他的<飞鸽><陌陌><啪啪>这些,几乎每一款应用都需要加载网络图片,那ToYueXinShangWan,这是比须熟练 ...

  2. android 加载网络图片

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  3. Android加载网络图片的工具类

    ImageView加载网络的图片 HttpUtil.java package com.eiice.httpuimagetils; import java.io.ByteArrayOutputStrea ...

  4. Android 加载网络图片设置到ImageView

    下载图片后显示在ImageView中 //1.定义全局变量 private Handler handler; private String image_url; private Bitmap bitm ...

  5. android官方开源的高性能异步加载网络图片的Gridview例子

    这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...

  6. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  7. Android Volley入门到精通:使用Volley加载网络图片

    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...

  8. Android三种基本的加载网络图片方式(转)

    Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...

  9. Android中用双缓存技术,加载网络图片

    最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...

随机推荐

  1. Linux 设置定时清除buff/cache的脚本

    Linux 设置定时清除buff/cache的脚本 查看内存缓存状态 [root@heyong ~]# free -m total used free shared buff/cache availa ...

  2. 从零开始学MySQL(四)

    上节连接:https://www.cnblogs.com/RajXie/p/10880809.html 上节说到,在创建表的同时,需要给出列的定义.列的定义可展开如下: 列名 列的数据类型 列的一些其 ...

  3. 微服务框架学习二:Http调用

    1. HTTP接口的意义 二进制接口使用的是java/hessian序列化协议,不能很好的与其他语言通信,虽然hessian也是一种跨语言的通用协议,但很多语言没有很好的实现该协议的产品.所以为了能够 ...

  4. STM32程序编写或调试犯过的错误

    1.宏定义后加了分号: eg: define NOKEY_PRES 0;      (❌) define NOKEY_PRES 0      (✔) 2.

  5. 动态路由协议RIP

    RIP Routing Information Protocol,属IGP协议,是距离矢量型动态路由协议(直接发送路由信息的协议为距离矢量型协议),使用UDP协议,端口号520. 贝尔曼福特算法 RI ...

  6. deviceiocontrol与ioctl

    驱动配置设置,配置 ioctl --linux 平台 https://blog.csdn.net/coolwriter/article/details/78242256

  7. Spring Cloud第十二篇 | 消息总线Bus

    ​ ​本文是Spring Cloud专栏的第十二篇文章,了解前十一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring ...

  8. Delphi-----接口请求,Get与Post

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  9. Python---进阶---文件操作---获取文件夹下所有文件的数量和大小

    一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前的文件夹 - 获取到当前文件夹下面所有的文件 - 处理我们当前的文件夹下面可能有文件夹的情况(也打印出来) - ...

  10. 关于ADM和高维空间下距离度量的问题

    最近聆听了两个IEEE FELLOW的高论.周末北大林老师来学校做了个报告,讲了很多新的机器学习概念.但是本人更关注的低秩学习,林老师只字未提.虽然如此,林老师的论文最近还是深入研究了很多,有多少改进 ...