Android读取网络图片

Android读取网络图片

大家好,又见面了,我是全栈君。

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

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

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

Android读取网络图片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>




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116304.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月23日 上午9:00
下一篇 2022年1月23日 上午10:00


相关推荐

  • 啥?扣子(coze)升级又收费,我在扣子(coze)究竟挣了多少钱?普通人还能玩转扣子吗?

    啥?扣子(coze)升级又收费,我在扣子(coze)究竟挣了多少钱?普通人还能玩转扣子吗?

    2026年3月12日
    2
  • BCNF范式的判断和分解

    BCNF范式的判断和分解首先 怎么判断一个关系是不是 BCNF 范式 简单来说 对于一个关系 R 每个函数依赖 X Y 的左侧都包含关系 R 的码 也就是说每个函数依赖的左侧都是关系 R 的一个超码 那么这个关系 R 是 BCNF 范式的 另一种判断方式是 对每个函数依赖 X Y 的左侧求闭包 如果对于每一个函数依赖 左侧的闭包都包含关系 R 中的所有属性 那么这个关系 R 是 BCNF 范式的 反之 用以上方法判断时 如果出现函数依赖不满足以上条件 那么就存在违背 BCNF 范式的情况 这个关系 R 就不是 BCNF 范式的 现在 我们有一个关系 R 和它一个函

    2026年2月11日
    4
  • 栈 数据结构_单调栈和单调队列

    栈 数据结构_单调栈和单调队列单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:数据出栈的序列为单调递增序列单调递减栈:数据出栈的序列为单调递减序列ps:这里一定要注意…

    2022年4月19日
    33
  • 老鸟的Python新手教程

    老鸟的Python新手教程

    2021年11月15日
    42
  • 公司部门英文缩写简称大全(1)

    公司部门英文缩写简称大全(1)本文转载自 https www cnblogs com lixyvip archive 2009 09 17 1568368 html 作者 lixyvip 转载请注明该声明 总公司 HeadOffice 分公司 BranchOffice 营业部 BusinessOffi 人事部 PersonnelDep 人力资源部 HumanResourc

    2026年3月19日
    2
  • 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」

    终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」前言核心部件1总体架构2微服务架构核心要素通讯协议1支持协议2性能比较服务依赖方式组件运行流程微服务架构组成以及注意事项1架构分解2注意事项总结前言微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影

    2022年6月19日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号