Android读取网络图片

时间:2022-02-12 05:13:30

  本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020  

在android4.0之后,已不同意在主线程中进行网络请求操作了, 否则会出现NetworkOnMainThreadException异常。

而为了解决在android4.0之上能够进行网络的请求,能够有两种方法来解决,以读取网络的图片为例,先看效果图:

Android读取网络图片

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVzc29uMjAxMjEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">Android读取网络图片

  当点击button时。会将指定地址的网络图片载入在imageVIew中进行显示。

读取网络图片:

  1. 获得指定地址网络图片数据

有两种方式将指定地址的网络读取到Bitmap中,然后通过imageView载入显示。

    1). 将输入流解码成Bitmap

private static String path = "http://221.203.108.70:8080/jxzy/UploadFiles_4517/201005/2010052615165701.jpg";
public Bitmap getData(){
Bitmap bitmap = null;
try {
URL url = new URL(path);
URLConnection conn = url.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}

  2). 通过字节数据将输入流写入到输入流中,并通过BitmapFactory.decodeByteArray()方法将其转换成Bitmap

public Bitmap getData1(){
Bitmap bitmap = null;
ByteArrayOutputStream bos = null;
try {
URL url = new URL(path);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
bos = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
while((len = is.read(data))!= -1){
bos.write(data, 0, len);
}
byte[] data1 = bos.toByteArray();
bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, data1.length);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}

2. 将得到的Bitmap装载在imageView中显示。

開始也提到了,在android4.0之上不就不能在主线程中直接进行网络请求等操作了,因此为了将网络图片载入到ImageView中,也有两种方法,详细例如以下:

  方法1:不新建线程。

直接在onCreate()方法中增加下面两行代码。然后直接在主线程中进行读取网络图片的操作。

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

  有了这两行代码。当然了。这些仅仅适用android4.0之上。你假设targetSDK在4.0之下,也能够不加这两行代码。直接在主线程中进行读取网络图片的操作,可是这样的方法并不推荐。

接下来就是将第一步两种方法得到Bitmap载入到imageView中,主要代码例如以下:

imageView = (ImageView)findViewById(R.id.imageView);

		button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
imageView.setImageBitmap(getData());
}
});

方法2: 利用Thread+Handler

由于。android也不同意在非UI线程中更新UI,所以不能直接将imageView.setImageBitmap()写在线程中。这就要借助于Handler了,由于Handler是执行在主线程中的,所以在读取网络数据利用Message消息来通知Handler来通知更新UI。主要代码例如以下:

Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == 1){
imageView.setImageBitmap(mBitmap);
}
};
};
Runnable runnable = new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = 1;
//mBitmap = getData();
mBitmap = getData1();
handler.sendMessage(msg);
}
};

接下来,就是在按钮的单击事件中新建一个线程并启动就可以。

button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(runnable).start();
}
});

最后,给出布局文件,例如以下:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取网络图片"
/>
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/> </RelativeLayout>

Android读取网络图片的更多相关文章

  1. Android读取网络图片到本地的简约的实现

    今天在网上看到了一个关于读取网络文件的小视频,觉得不错,拿来与大家分享 思路 具体的思路比较的简单,但是思想非常的单纯.那就是输入一个网址,点击按钮,将从网络上获取的一张图片显示到一个ImageVie ...

  2. (14)&lbrack;Xamarin&period;Android&rsqb; 异步的网络图片下载

    原文 [Xamarin.Android] 异步的网络图片下载 在设计要从网络上接大量数据并且显示在Android Listview中,而这些资料是利用Json格式传送并且数据中包含这图片档案. 那在X ...

  3. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  4. Python配合BeautifulSoup读取网络图片并保存在本地

    本例为Python配合BeautifulSoup读取网络图片,并保存在本地. BeautifulSoup可代替正则表达式,更好地解析Html文本,获取其中的指定内容,如Tag.Property等 # ...

  5. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  6. Android - 读取JSON文件数据

    Android读取JSON文件数据 JSON - JavaScript Object Notation 是一种存储和交换文本信息的语法. JSON对象在花括号中书写.用逗号来分隔值. JSON数组在方 ...

  7. Android 读取Assets下的资源文件

    做Android开发近半年了,东西越学越多,硬盘容量越来越小.很多东西找起来也不方便,为此,我打算从今天起把工作中学到的东西整理起来,写成日记.也希望与广大网友分享我的经验.一同进步.今天主要介绍文件 ...

  8. Android之网络图片加载的5种基本方式

    学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...

  9. Android 读取assets文件下的txt文件

    android 读取assets文件下的txt文件,解决了读取txt文件的乱码问题: package com.example.com.scrollview; import java.io.Buffer ...

随机推荐

  1. Android 开源库和项目 2

    1.带尾巴的RecyclerViewPager 特点:1.像viewPager一样滑动一次就滑动一页 2.像画廊gallery一样,滑动一次可以滑动很多页 3.竖向滑动 4.支持点击事件,没有错乱   ...

  2. HDU 5023 A Corrupt Mayor&&num;39&semi;s Performance Art 线段树区间更新&plus;状态压缩

    Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5023 #include <cstdio> #include <cstring&g ...

  3. R中创建not-yet-evaluated对象

    create not-yet-evaluated object在R中创建 not-yet-evaluated(就是some code we will evaluated later!!)对象;然后执行 ...

  4. &lbrack;转载&rsqb;EF Code First 学习笔记&colon;约定配置

    要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...

  5. selenium&plus;python定位元素方法

    定位元素方法 官网地址:http://selenium-python.readthedocs.org/locating-elements.html        这里有各种策略用于定位网页中的元素(l ...

  6. iOS学习——属性引用self&period;xx与&lowbar;xx的区别

    在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性.但是一直有一个疑惑,那就是这两个之间有什么区别呢?最初我一直觉得这两个之间没什么区 ...

  7. webservice接口,用Soapui

    webservice接口怎么测试呢,他不需要你在拼报文了,会给一个webservice的地址,或者wsdl文件,直接在soapui导入,就可以看到这个webservice里面的所有接口,也有报文,直接 ...

  8. mycql 多表联合查询

    egon笔记: 1 单表查询 select distinct 字段1,字段2,字段3 from 表 where 约束条件 group by 分组字段 having 过滤条件 order by 排序字段 ...

  9. IIS发布的网站常见的问题汇总

    1.安装.NET4.0时缺少WIC导致不能装上.NET4.0,下载安装后即可,下载地址如下,根据系统版本选择对应软件 32位版:https://www.microsoft.com/zh-cn/down ...

  10. VM虚拟机装centos无法自动获取IP的解决方法

    在虚拟机中使用ip addr 查看网卡 可以看到这个ens33,可能每台机器的名称不一样 然后找到/etc/sysconfig/network-scripts/ifcfg-eth33 编辑此文件 vi ...