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. jquery点击div以外的区域触发事件

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. MFC写入.ini文件的策略

    在使用WritePrivateProfileString的时候, 如果前两个参数已经在INI文件中存在,那该函数的作用就是修改键值,即楼主说的覆盖 如果第一个参数存在,第二个参数不存在,那作用是在IN ...

  3. pre 布局

    w

  4. 【python】-- 类的创建、__new__、__metaclass___

    类的创建 前面的随笔都是关于类的知识,通过类创建对象,那这个类到底是怎么产生的呢? 1. 传统创建类 class Foo(object): def __init__(self,name): self. ...

  5. 【我的Android进阶之旅】 Android Studio插件之Jenkins插件介绍

    一Jenkins插件功能介绍 1Jenkins任务列表 2切换Jenkins分组 3构建Jenkins任务 4进入构建Jenkins任务的页面 5进入最后一次构建Jenkins任务的页面 6增加Jen ...

  6. Python3+Selenium3自动化测试-(四)

    selenium鼠标事件 # coding=utf-8 import time from selenium import webdriver from selenium.webdriver.commo ...

  7. 关闭SourceInsight的大括号自动缩进

    使用Source Insight可以很好的管理项目代码,也非常便于阅读.但是,在使用Source Insight书写C语言代码时,会发现这样的问题,键入大括号之后,它会自动缩进一个制表符,这种处理跟我 ...

  8. [intellij]create gradle project

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/206806425/comments/206797339

  9. DBMS_MONITOR程序开启10046事件

    在具有连接池或共享服务器的多层环境中,一个会话可以跨越多个进程,甚至跨越多个实例.DBMS_MONITOR是在Oracle 10g中引入的内置的程序包,通过该程序包可以跟踪从客户机到中间层.再到后端数 ...

  10. Visual Studio 2012的Windows Service服务安装方式

    windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始 ...