Android读取网络图片

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVzc29uMjAxMjEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

  当点击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>

时间: 2024-08-01 19:09:23

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

读取网络图片

利用bitmap读取网络图片,太简单没什么好说的,注意更新UI要在主线程上,不然会报错. package com.example.web_bitmap; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.example.web_

Android查看网络图片例子

1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_hei

android下载网络图片并缓存

异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ImageCallback callback); public void downloadImage(final String url, final boolean cache2Memory, final ImageCallback callback); public void setCache2F

WP_图片管理机制/异步读取网络图片

项目有这样的需求, 要求窗口加载一揽子图片,为了不让UI阻塞太久,采用异步读取后绑定显示的方案. 图片的下载应该采用并发的过程(等待网络响应会很耗时,一张一张的下载,等待时间太长) 图片的下载不能占用过多的线程数,应有个阀值(图片不是核心业务,不能占用那么多资源) 在图片加载的过程中,如果用户有操作,比如窗口跳转,则未加载完成的图片加载的过程应取消(为了替用户节省流量). 需求就是这么多了,如何实现呢? 思路是这样的,由于需要异步,且需要等待,首先想到使用队列,先让队列排列起来,再定量迭代读取.

android 读取xml

在有些应用中,有一点小数据,直接存储在XML就是,实现较为简单, 1.xml文件放入asset文件夹,结构如: <?xml version="1.0" encoding="UTF-8" ?> <messages><message id="1"><title>3月毕业证数码像采集</title><date1>3</date1><content>3月12日

Android 读取工程内资源文件的两种方法

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 总结: asset目录下文件: 称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的,不会自动生成R文件的ID 访问: 获取路径: file://android_asset/test.xml //工程根目录下的assets文件夹中存放,比如assets/test

android 读取SQLite android could not open the database in read/write mode错误

由于AndroidManifest.xml文件中uses-permission没有设置权限问题 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permissio

android 读取,写入图片到sd卡源码

<pre name="code" class="html"><!--<span style="font-family: Arial, Helvetica, sans-serif;">在AndroidMainfest.xml文件中添加</span><span style="font-family: Arial, Helvetica, sans-serif;">-->&l

android 读取DDMS里的文件时打不开,解决办法

1.问题:安卓自带数据库SQLite数据读取时(ddms---data----data----yourprojectname----databases),当点击data时目录展不开.从而无法查看数据库表中的数据. 2.方法:第一获得ROOT权限,如何获得root权限?我下载了一个一键root工具,挺好用的 (muzisoft.exe)安装在电脑上,并连接手机.点击一键root,等几分钟即可. 3.修改要查看文件的权限,下载一个RE(R.E管理器)并安装在手机上,运行,长按要查看的文件,在弹出的列