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. Eclipse Git分支实战

    切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...

  2. 05-转置-置换-向量空间R

    一.置换矩阵 一个矩阵的行或者列交换,可以借助另外一个矩阵相乘来实现 首先是行交换: $\underbrace{\left[\begin{array}{ccc}{1} & {1} & ...

  3. 下载zip

  4. 最长公共子序列板/滚动 N^2

    #include <bits/stdc++.h> using namespace std; int main() { ][],t; ],b[]; bool now,pre; scanf(& ...

  5. java String源码浅出

    1.public char charAt(int index) 返回指定索引处的 char 值. 源码: =====================String.class============== ...

  6. Deepin(Ubuntu)安装rpm软件包

    1.首先安装alien和fakeroot这两个软件,alien可以将rpm转换为deb包. 在终端中输入命令 sudo apt-get install alien fakeroot 2.使用alien ...

  7. Springboot读取properties配置文件数据

    一.使用@ConfigurationProperties来读取 1.Coffer entity @Configuration @ConfigurationProperties(prefix = &qu ...

  8. Spring Security初识

    Spring Security与Spring Boot集成 添加依赖: <dependency> <groupId>org.springframework.boot</g ...

  9. [window] 使用Pyhton轻便好用的spyder IDE进行代码分析时如何指定相关的配置文件

    spyder 使用pylint这个第三方库进行代码检查,其实pylint使用的代码规范默认也是pep8,不过该库还有 其它用途,在这里我专门写写在代码分析时,如何指定配置文件 一般来说,使用spyde ...

  10. 开发工具Intellij IDEA:常用快捷键

    重命名:shift + F6 查看Javadoc/详情:ctrl + Q 查找接口的实现类:ctrl + alt + B format代码:ctrl + alt + L 全局查询:ctrl + shi ...