首先,需要添加权限。

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

整体代码如下:

package com.tarena.viewer;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; /**
* 网络图片查看器,需要添加Internet权限
* @author chenchi
*
*/
public class MainActivity extends Activity implements OnClickListener { Handler handler = new Handler(){
//处理消息的时候我们需要区分这是成功的消息还是失败的消息
//此方法在主线程中调用,可以用来刷新UI
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap((Bitmap) msg.obj);
break;
case 2:
Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
break;
} }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_download = (Button) findViewById(R.id.btn_download);
btn_download.setOnClickListener(this);
} @Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() { @Override
public void run() {
//下载图片
//1.确定网址
String path = "http://192.168.31.225:8088/user.png";
try {
//2.把网址封装成一个URL对象
URL url = new URL(path);
//3.获取客户端和服务器的连接对象,此时还没有建立连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//4.对连接对象进行初始化
//设置请求方法,注意大写
conn.setRequestMethod("GET");
//设置连接超时
conn.setConnectTimeout(10000);
//设置读取超时
conn.setReadTimeout(10000);
//5.发送请求,与服务器建立连接
conn.connect();
//如果响应码为200,说明请求成功
if(conn.getResponseCode() == 200){
//获取服务器响应头中的流,流里的数据就是客户端啊请求的数据
InputStream is = conn.getInputStream();
//读取出流里面的数据,并构造成位图对象
Bitmap bm = BitmapFactory.decodeStream(is); /*
* 这两行代码为什么注释,是因为运行也没有结果的
* 因为只有主线程才能刷新UI操作,子线程是不可以的
*/
// ImageView imageView = (ImageView) findViewById(R.id.image_view);
// imageView.setImageBitmap(bm); //把消息返送到主线程的消息队列
Message msg = new Message();
//消息对象可以携带数据
msg.obj = bm;
msg.what = 1; //成功加载消息,返回1
handler.sendMessage(msg);
}else{
Message msg = handler.obtainMessage();//这样获取message是在池中获取,减少内存负荷
msg.what = 2;//失败加载消息,返回0
handler.sendMessage(msg);
} } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}); thread.start();
} }

还可以继续加上缓存的功能。

package com.tarena.viewer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; import android.R.integer;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; /**
* 网络图片查看器,需要添加Internet权限
* @author chenchi
*
*/
public class MainActivity extends Activity implements OnClickListener { private String getFilesName(String path) {
int index = path.lastIndexOf("/");
return path.substring(index + 1);
} Handler handler = new Handler(){
//处理消息的时候我们需要区分这是成功的消息还是失败的消息
//此方法在主线程中调用,可以用来刷新UI
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap((Bitmap) msg.obj);
break;
case 2:
Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
break;
} }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_download = (Button) findViewById(R.id.btn_download);
btn_download.setOnClickListener(this);
} @Override
public void onClick(View v) {
//下载图片
//1.确定网址
final String path = "http://192.168.31.225:8088/user.png";
//读取数据库返回的流里的数据,把数据写到本地文件,缓存起来
final File file = new File(getCacheDir(), getFilesName(path));
//判断,缓存中是否存在该文件
if(file.exists()){
//如果缓存存在,从缓存中读取数据
System.out.println("从缓存读取的");
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bm);
return;
}
System.out.println("从网络下载的");
Thread thread = new Thread(new Runnable() { @Override
public void run() { try {
//2.把网址封装成一个URL对象
URL url = new URL(path);
//3.获取客户端和服务器的连接对象,此时还没有建立连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//4.对连接对象进行初始化
//设置请求方法,注意大写
conn.setRequestMethod("GET");
//设置连接超时
conn.setConnectTimeout(10000);
//设置读取超时
conn.setReadTimeout(10000);
//5.发送请求,与服务器建立连接
conn.connect();
//如果响应码为200,说明请求成功
if(conn.getResponseCode() == 200){
//获取服务器响应头中的流,流里的数据就是客户端啊请求的数据
InputStream is = conn.getInputStream(); byte[] b = new byte[1024];
FileOutputStream fos = new FileOutputStream(file);
int len = -1;
while((len = is.read(b)) != -1){
fos.write(b, 0, len);
} //读取出流里面的数据,并构造成位图对象
//Bitmap bm = BitmapFactory.decodeStream(is);
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
/*
* 这两行代码为什么注释,是因为运行也没有结果的
* 因为只有主线程才能刷新UI操作,子线程是不可以的
*/
// ImageView imageView = (ImageView) findViewById(R.id.image_view);
// imageView.setImageBitmap(bm); //把消息返送到主线程的消息队列
Message msg = new Message();
//消息对象可以携带数据
msg.obj = bm;
msg.what = 1; //成功加载消息,返回1
handler.sendMessage(msg);
}else{
Message msg = handler.obtainMessage();//这样获取message是在池中获取,减少内存负荷
msg.what = 2;//失败加载消息,返回0
handler.sendMessage(msg);
} } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }); thread.start();
} }

Android中用URL模拟一个简单的图片加载器的更多相关文章

  1. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  2. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  3. Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载

    在使用这个框架的时候,我们必须要配置一个DisplayImageOptions对象来作为ImageLoader.getInstance().displayImage()中的参数,所以很有必要讲解这个对 ...

  4. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  5. 使用RequireJS并实现一个自己的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  6. Android 框架修炼-自己开发高效异步图片加载框架

    一.概述 目前为止,第三方的图片加载框架挺多的,比如UIL , Volley Imageloader等等.但是最好能知道实现原理,所以下面就来看看设计并开发一个加载网络.本地的图片框架. 总所周知,图 ...

  7. 14. Android框架和工具之 ImageLoader(图片加载)

    1. 这个图片加载框架网友很多都已经使用过,而且分析也很到位,这里我就不写了,直接引用别人,尊重别人的劳动成果. 2. 参考如下: (1)Android 开源框架Universal-Image-Loa ...

  8. 在Qt Quick中一个简单Hello World加载过程

    Qt5基本类图: QQmlEngine    QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次架构,QML提供了一个默认的QML上下文(根上下文,获取函数QQmlEngi ...

  9. 高性能异步图片加载器的JS库:lazysizes

    <script src="lazysizes.min.js" async=""></script> 使用示例 <!-- non-r ...

随机推荐

  1. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  2. POJ 1679 The Unique MST --Kruskal应用

    这题可以用次小生成树解,这里用Kruskal算法来做.每条边除维护u,v,w外,还维护: used:表示这条边是否加过 eq:表示有没有与这条边相等的边 del:删除标记,以便删边之用 如果对于一个最 ...

  3. tomcat7 - 烫手山芋之热部署

    tomcat7部署,项目发布有很多种方式 1. 增量发布,把修改过得那些文件手动上传至tomcat,*.class *.xml 等等,这样的缺点非常大,需要断开tomcat,记住那些你修改过得文件,很 ...

  4. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  5. Mac上安装node.js

    1.下载node for mac并一路默认安装 2.测试成功否 3.copy this file to test(save as javascript file) var http = require ...

  6. Android view中的requestLayout和invalidate方法

    Android view中的requestLayout和invalidate方法 requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent v ...

  7. 【转】【C#】序列化(Serialize)、反序列化(Deserialize)

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: 1. ...

  8. 【原创】有关Silverlight DataGrid双击事件的分析 完整分析 代码与示例

    公司项目用的silverlight,而且silverlight一些技术 资料比较少.所以分享出来 给大家参考参考. 有关Silverlight中DataGrid 双击事件 的代码 如下: 1. 前台x ...

  9. C语言 百炼成钢2

    //题目4:输入某年某月某日,判断这一天是这一年的第几天? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<st ...

  10. 利用Chrome插件向指定页面植入js,劫持 XSS

    资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...