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. RK3288之kernel目录结构以及功能

    :~/RK3288/kernel$ ls android include MAINTAINERS security arch init Makefile sound backported-featur ...

  2. u-boot-2016.09 make编译过程分析(二)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/guyongqiangx/article/ ...

  3. uboot if_changed函数

    u-boot编译过程分析 u-boot.lds: $(LDSCRIPT) prepare FORCE $(call if_changed_dep,cpp_lds) u-boot: $(u-boot-i ...

  4. HTML加载过程

    在地址栏输入url,返回html后,浏览器开始顺序加载并渲染DOM Body标签 当浏览器遇到body标签才算真正开始加载并渲染DOM,此时会有以下几种情况: DOM元素 浏览器遇到dom元素时,正常 ...

  5. OI比赛常数优化

    这是一篇玄学文章 一.编译优化 #pragma GCC optimize("O3") #pragma G++ optimize("O3") 预处理开O3优化 比 ...

  6. man diff

    DIFF(1)                            GNU Tools                           DIFF(1) NAME/名称       diff - ...

  7. A1011

    找最大的,然后按规定计算后输出. 没啥可说的,除非犯了愚蠢的错误(比如把j写成i这种),按题目要求写就是了. #include<cstdio> int main(){ ]={'W','T' ...

  8. node创建项目,要ejs模板引擎,不要jade怎么办?

    创建项目时:express ejs blog,生成的是.jade文件怎么办?我想要的是ejs的呀 上述语句不仅名字不对,生成文件的格式也不是我想要的. 不妨试试:express -e blog 这下就 ...

  9. 奇偶选择器:使用odd和even属性实现表格单双行颜色相间和不同

    一.奇偶选择器 表格在呈现数据的时候我们为了方便观看,而隔行显示不同的颜色,虽然可以用用类选择器 class实现这种效果,但是未免太过麻烦,为了更加简便地表现这种特殊的效果我们需要用到一种特殊的选择器 ...

  10. 阿里云产品家族再添新丁:视觉AI、CPFS一体机助力企业全面上云

    近日举行的2019阿里云广东峰会上,阿里云宣布推出面向混合云场景的CPFS一体机和视觉AI一体机,两款新品具备超高性能.开箱即用等特性,极大降低企业上云的周期和门槛. 加上此前推出的POLARDB数据 ...