ImageView显示网络上的图片

一、简介

二、方法

1)ImageView显示网络上的图片方法

第一步:从网络上下载图片

byte[] byteArr = downImage();//这个是自己写的函数

将byte数组转换成bitmap

Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0,byteArr.length);

第二步:在imageView控件上显示图片

iv_fromNet.setImageBitmap(bitmap1);

第三步:给手机设置能联网的属性

在AndroidManifest.xml中设置能联网的权限

<uses-permission android:name="android.permission.INTERNET" />

2)从网络上下载图片的方法

第一步:创建url连接

URL url = new URL("http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg");

第二步:拿到HTTP连接对象

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

第三步:设置连接超时

connection.setConnectTimeout(5000);

第四步:设置HTTP请求方式

connection.setRequestMethod("GET");

第五步:获得响应状态码

int code = connection.getResponseCode();

连接成功后

第六步:拿到输入流,用于读取响应的内容

InputStream is = connection.getInputStream();

第七步:输出流用于写数据

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

第八步:读取数据就好

byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
  byteArrayOut.write(buffer, 0, len);
}
return byteArrayOut.toByteArray();

三、代码实例

效果图:

点击按钮之后,获取http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg的图片

代码:

/iamgeViewDemo1/src/fry/Activity04.java

 package fry;

 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import com.example.iamgeViewDemo1.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; public class Activity04 extends Activity {
// 1)ImageView显示网络上的图片方法
// 第一步:从网络上下载图片
//
// 第二步:在imageView控件上显示图片
//
// 第三步:给手机设置能联网的属性
private ImageView iv_fromNet;
private Button btn_downLoadImage; @SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
setTitle("imageView显示网络上的图片");
super.onCreate(savedInstanceState); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build()); setContentView(R.layout.activity03); btn_downLoadImage = (Button) findViewById(R.id.btn_downLoadImage);
iv_fromNet = (ImageView) findViewById(R.id.iv_fromNet); btn_downLoadImage.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub BitmapDrawable bitmapDrawable=(BitmapDrawable)(getResources().getDrawable(R.drawable.image1));
Bitmap bitmap2=bitmapDrawable.getBitmap();
//
// iv_fromNet.setImageBitmap(bitmap2); // 从网络上下载图片
byte[] byteArr = downImage(); // 在imageView控件上显示图片
Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0,
byteArr.length);
iv_fromNet.setImageBitmap(bitmap1);
// 给手机设置能联网的属性 }
}); } /**
* 从网络中下载图片
*
*/
private byte[] downImage() {
try {
//创建url连接
URL url = new URL(
"http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg");
// 拿到HTTP连接对象
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
// 设置连接超时
connection.setConnectTimeout(5000);
// HTTP请求方式
connection.setRequestMethod("GET");
// 获得响应状态码
int code = connection.getResponseCode();
if (code == 200) {// 表示获取成功
// 拿到输入流,用于读取响应的内容
InputStream is = connection.getInputStream();
// 输出流用于写数据
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
// 设置缓存数组
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
byteArrayOut.write(buffer, 0, len);
}
return byteArrayOut.toByteArray();
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} // 2)从网络上下载图片的方法
//
// 第一步:创建url连接
// 第二步:拿到HTTP连接对象
// 第三步:设置连接超时
// 第四步:设置HTTP请求方式
// 第五步:获得响应状态码
// 连接成功后
//
// 第六步:拿到输入流,用于读取响应的内容
// 第七步:输出流用于写数据
// 第八步:读取数据就好 }

/iamgeViewDemo1/res/layout/activity03.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/btn_downLoadImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从网络上下载图片"
/> <ImageView
android:id="@+id/iv_fromNet"
android:layout_width="match_parent"
android:layout_height="match_parent"
/> </LinearLayout>

/iamgeViewDemo1/AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.iamgeViewDemo1"
android:versionCode="1"
android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="fry.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="fry.Activity01"
android:exported="true" >
</activity>
<activity
android:name="fry.Activity02"
android:exported="true" >
</activity>
<activity
android:name="fry.Activity03"
android:exported="true" >
</activity>
<activity
android:name="fry.Activity04"
android:exported="true" >
</activity>
</application> </manifest>

四、收获

1、debug找错误

2、源代码和方法说明找bug

3、输入流和输出流

输入内容到输入流,然后到内存,内存中的数据到输出流,输出流的数据到输出。

1)拿到输入流,用于读取响应的内容
InputStream is = connection.getInputStream();

2)把输入流is中的东西读到buffer中

is.read(buffer)

3)buffer中的内容写到输出流byteArrayOut

byteArrayOut.write(buffer, 0, len);

4、byte array变成bitmap

Bitmap bitmap1 = BitmapFactory.decodeByteArray(byteArr, 0,byteArr.length);

5、创建url连接

URL url = new URL("http://img5.imgtn.bdimg.com/it/u=3902436073,1089717092&fm=26&gp=0.jpg");

6、拿到HTTP连接对象

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

五、遇到的bug

1、android.os.NetworkOnMainThreadException

这是因为在android3.0后主线程中不许网络连接

解决方法:添加了一段线程警察的代码

2、bitmap1==null但是用于创建bitmap1的byte array有数据

byte array不能被decode,换一张图片就好

3、还有很多bug,都忘记了

ImageView显示网络上的图片的更多相关文章

  1. [Android]通过setImageURI设置网络上面的图片

    设置imageView显示网络上的图片 picUrl = new URL(getIntent().getExtras().getString("map_url")); Bitmap ...

  2. ios 从网络上获取图片并在UIImageView中显示

    ios 从网络上获取图片   -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ...

  3. Android 多线程:使用Thread和Handler (从网络上获取图片)

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分 ...

  4. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  5. 【iOS开发-从网络上获取图片尺寸】

    实际开发过程中,容易碰到从网络上获取图片尺寸的场景,比如一个UIImageView要装载从网络上获取的图片,但要先设置其frame,此时又不知道图片尺寸,就要从网络上获取尺寸了.为了最好的用户体验,一 ...

  6. 使用SimpleAdapter 适配器时显示网络上图片方法

    SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem, R.layout.items_list, new String[] ...

  7. 从网络上获取图片并保存在sdCard上

    package com.aib.soft; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileO ...

  8. 用thinkphp将网络上的图片下载到本地服务器

    我用的thinkphp版本是3.2.3,这个版本的跟更早些版本的调用方法不太一样,正确的调用方法是: Demo3Controller.class <?php namespace Home\Con ...

  9. 从网络上获取图片,并写入excel文件

    package com.weChat.utils; import com.manage.utils.DateUtil;import com.manage.utils.MD5Util;import or ...

随机推荐

  1. VB 十六进制转汉字的函数

    Public Function HexToStr(ByVal strs As String) As String Dim i As Integer, tmp As String, n If Len(s ...

  2. Spring 框架的 applicationContext.xml 配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. make Makefile 与 cmake CMakeLists.txt

    make Makefile 与 cmake CMakeLists.txt 大家都知道,写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器 ...

  4. django之多表查询与创建

    https://www.cnblogs.com/liuqingzheng/articles/9499252.html # 一对多新增数据 添加一本北京出版社出版的书 第一种方式 ret=Book.ob ...

  5. 我的Android进阶之旅------>解决Android Studio全局搜索搜不到结果的问题

    1.问题描述 今天使用Android Studio时,想通过使用快捷键Ctrl+Shift+F来进行全局搜索指定字符串,如下图所示:想搜索字符串"码农偷懒了", 打开string. ...

  6. 安卓项目eclipse有用教程:设置应用名字和图标、屏幕、签名、真机调试、clean、logcat、json解析

    怎样在安卓项目中.设置游戏的应用名字和图标? 我们在Androidproject的res资源目录下.会看到3个drawable的目录和一个values目录.就是在这里改动即可.   关于改动应用程序名 ...

  7. springcloud 开发时快速剔除无用服务

    注册中心配置: # 关闭保护机制 eureka.server.enable-self-preservation=false #剔除失效服务间隔 eureka.server.eviction-inter ...

  8. NoSQL选型及HBase案例详解(转)

    从 NOSQL的类型到 常用的产品,我们已经做过很多关于NoSQL的文章,今天我们从国内著名的互联网公司及科研机构的实战谈一下NoSQL数据库. NoSQL一定程度上是基于一个很重要的原理—— CAP ...

  9. 基于mondrian聚合表的R计算olap开发

    原文出处:http://www.cnblogs.com/qiaoyihang/p/7348328.html 最近在做基于Mondrian的olap开发,总结一下! 一. schema构建 1.思考:我 ...

  10. python代码结构

    1. 使用#单行注释,使用'''...'''多行注释 2. 使用连接符\来把一行过长的代码分为多行 3. 用缩进来控制代码块,推荐使用PEP8缩进风格,即四个空格 4. if ...: elif... ...