Android加载网络图片报android.os.NetworkOnMainThreadException异常
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异常的更多相关文章
- Android加载网络图片学习过程
好多应用,像我们公司的<乘友>还有其他的<飞鸽><陌陌><啪啪>这些,几乎每一款应用都需要加载网络图片,那ToYueXinShangWan,这是比须熟练 ...
- android 加载网络图片
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Android加载网络图片的工具类
ImageView加载网络的图片 HttpUtil.java package com.eiice.httpuimagetils; import java.io.ByteArrayOutputStrea ...
- Android 加载网络图片设置到ImageView
下载图片后显示在ImageView中 //1.定义全局变量 private Handler handler; private String image_url; private Bitmap bitm ...
- android官方开源的高性能异步加载网络图片的Gridview例子
这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- Android Volley入门到精通:使用Volley加载网络图片
在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...
- Android三种基本的加载网络图片方式(转)
Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...
- Android中用双缓存技术,加载网络图片
最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...
随机推荐
- Cookie&Session笔记
# 今日内容 1. 会话技术 1. Cookie 2. Session 2. JSP:入门学习 ## 会话技术 1. 会话:一次会话中包含多次请 ...
- Kubernetes 入门-学习-nginx安装-dashboard安装
一.入门 1.Kubernetes中文社区---http://docs.kubernetes.org.cn/ 2.Kubernetes集群组件: - etcd 一个高可用的K/V键值对存储和服务发现系 ...
- 仿scikit-learn模式写的kNN算法
一.什么是kNN算法 k邻近是指每个样本都可以用它最接近的k个邻居来代表. 核心思想:如果一个样本在特征空间中的k个最相邻的样本中大多数属于一个某类别,则该样本也属于这个类别. 二.将kNN封装成kN ...
- Linux之文件内容查阅
1. 直接查看文件内容 (1)cat命令,由第一行开始显示文件内容 -b,列出行号,仅显示出非空白行,空白行不标行号 -n,列出行号,空白行也会标行号 (2)tac命令,由最后一行到第一行反向在屏幕上 ...
- [ZJOI2006]物流运输(动态规划,最短路)
[ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个 ...
- 特殊字符(包括emoji)梳理和UTF8编码解码原理(转)
转自:https://www.jianshu.com/p/57c27d67a8a8 背景知识 emoji表情符号,是20世纪90年代由NTT Docomo栗田穣崇(Shigetaka Kurit)创建 ...
- CCF201412-2 Z字形扫描 java(100分)
试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...
- js原生高逼格插件
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
- layui问题之渲染数据表格时,只显示10条数据
通过ajax请求的数据,console.log()有30条数据,实际上只显示10条, 原因是没有设置limit table.render({ elem: '#report-collection' , ...
- 对postman的研究
1.Postman可用作macOS,Windows和Linux操作系统的本机应用程序. 2.最常用的方法是GET,POST,PUT和DELETE.方法的名称是不言自明的.例如,GET使您可以从服务器检 ...