Android之查看网络图片和网页HTML
网络编程是Android应用中很重要的一部分,本文主要讲述了利用HttpURLConnection获取网络图片和HTML的方法。
获取网络图片
public class MainActivity extends Activity implements OnClickListener {
private static final String TAG = "MainActivity";
protected static final int ERROR = 1;
private EditText etUrl;
private ImageView ivIcon;
private final int SUCCESS = 0;
private Handler handler = new Handler() {
/**
* 接收消息
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i(TAG, "what = " + msg.what);
if(msg.what == SUCCESS) { // 当前是访问网络, 去显示图片
ivIcon.setImageBitmap((Bitmap) msg.obj); // 设置imageView显示的图片
} else if(msg.what == ERROR) {
Toast.makeText(MainActivity.this, "抓去失败", 0).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivIcon = (ImageView) findViewById(R.id.iv_icon);
etUrl = (EditText) findViewById(R.id.et_url);
findViewById(R.id.btn_submit).setOnClickListener(this);
}
@Override
public void onClick(View v) {
final String url = etUrl.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getImageFromNet(url);
// ivIcon.setImageBitmap(bitmap); // 设置imageView显示的图片
if(bitmap != null) {
Message msg = new Message();
msg.what = SUCCESS;
msg.obj = bitmap;
handler.sendMessage(msg);
} else {
Message msg = new Message();
msg.what = ERROR;
handler.sendMessage(msg);
}
}}).start();
}
/**
* 根据url连接取网络抓去图片返回
* @param url
* @return url对应的图片
*/
private Bitmap getImageFromNet(String url) {
HttpURLConnection conn = null;
try {
URL mURL = new URL(url); // 创建一个url对象
// 得到http的连接对象
conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("GET"); // 设置请求方法为Get
conn.setConnectTimeout(10000); // 设置连接服务器的超时时间, 如果超过10秒钟, 没有连接成功, 会抛异常
conn.setReadTimeout(5000); // 设置读取数据时超时时间, 如果超过5秒, 抛异常
conn.connect(); // 开始链接
int responseCode = conn.getResponseCode(); // 得到服务器的响应码
if(responseCode == 200) {
// 访问成功
InputStream is = conn.getInputStream(); // 获得服务器返回的流数据
Bitmap bitmap = BitmapFactory.decodeStream(is); // 根据 流数据 创建一个bitmap位图对象
return bitmap;
} else {
Log.i(TAG, "访问失败: responseCode = " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn != null) {
conn.disconnect(); // 断开连接
}
}
return null;
}
}
不能子线程中改变主线程页面,故需要使用Handler
上面的方法较为烦琐,使用github上的开源库,android-smart-image-view可以有效的实现相同的功能,同时简化操作,使用方法是将开源库src文件夹下的内容复制一份到工程中,同时在布局文件中,使用全类名使用自定义控件SmartImageView即可.
android-smart-image-view实现
public class MainActivity2 extends Activity implements OnClickListener {
private EditText etUrl;
private SmartImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
etUrl = (EditText) findViewById(R.id.et_url);
mImageView = (SmartImageView) findViewById(R.id.iv_icon);
findViewById(R.id.btn_submit).setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 1. 取出url, 抓取图片
String url = etUrl.getText().toString();
mImageView.setImageUrl(url);
}
}
查看网页HTML实现
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static final int SUCCESS = 0;
protected static final int ERROR = 1;
private EditText etUrl;
private TextView tvHtml;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SUCCESS:
tvHtml.setText((String) msg.obj);
break;
case ERROR:
Toast.makeText(MainActivity.this, "访问失败", 0).show();
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etUrl = (EditText) findViewById(R.id.et_url);
tvHtml = (TextView) findViewById(R.id.tv_html);
}
public void getHtml(View v) {
final String url = etUrl.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
// 请求网络
String html = getHtmlFromInternet(url);
if(!TextUtils.isEmpty(html)) {
// 更新textview的显示了
Message msg = new Message();
msg.what = SUCCESS;
msg.obj = html;
handler.sendMessage(msg);
} else {
Message msg = new Message();
msg.what = ERROR;
handler.sendMessage(msg);
}
}
}).start();
}
/**
* 根据给定的url访问网络, 抓去html代码
* @param url
* @return
*/
protected String getHtmlFromInternet(String url) {
try {
URL mURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(10000);
conn.setReadTimeout(5000);
// conn.connect();
int responseCode = conn.getResponseCode();
if(responseCode == 200) {
InputStream is = conn.getInputStream();
String html = getStringFromInputStream(is);
return html;
} else {
Log.i(TAG, "访问失败: " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根据流返回一个字符串信息
* @param is
* @return
* @throws IOException
*/
private String getStringFromInputStream(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
is.close();
String html = baos.toString(); // 把流中的数据转换成字符串, 采用的编码是: utf-8
String charset = "utf-8";
if(html.contains("gbk") || html.contains("gb2312")
|| html.contains("GBK") || html.contains("GB2312")) { // 如果包含gbk, gb2312编码, 就采用gbk编码进行对字符串编码
charset = "gbk";
}
html = new String(baos.toByteArray(), charset); // 对原有的字节数组进行使用处理后的编码名称进行编码
baos.close();
return html;
}
}
使用这种方法HTML有时会产生乱码,解决方法如上
完成
Android之查看网络图片和网页HTML的更多相关文章
- Android 网络图片查看器与网页源码查看器
在AndroidManifest.xml里面先添加访问网络的权限: <uses-permission android:name="android.permission.INTERNET ...
- android 网络_网络图片查看器
xml <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" ...
- 如何在Android应用中引入外部网页
在某些情况下,我们需要在Android应用中引入外部网页,这里记录一下如何操作(其实很简单^.^). 先介绍一下开发环境: 开发工具:Android Studio 1.5 SDK API版本:17 操 ...
- URL转Drawable之 Android中获取网络图片的三种方法
转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...
- [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案
[Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 在Android里,可以使用WebView来呈现本地或是远程的网页内容.但是在显示本地网页时,如 ...
- Android如何查看应用签名信息
转自http://www.trinea.cn/android/android-view-signatures/comment-page-1/ 介绍Android如何查看自己的应用签名及三方APK或系统 ...
- 【Android Studio安装部署系列】二十八、Android Studio查看其它APP的布局结构
概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 参考<[Android Studio安 ...
- Android下查看共享库依赖项
Android下查看共享库依赖项 [时间:2017-02] [状态:Open] [关键词:android,共享库依赖项,so,ndk,objdump,readelf] 起因 近期在处理Android下 ...
- android studio 查看大纲
就是 structure 面板 快捷键 Alt+7 === android studio 查看方法说明 点击菜单“View”-“Quick Documentation" 建议直接查看源代码文 ...
随机推荐
- linux 的jdk安装
1.1 解压上传的安装包 1.2 创建安装目录 1.3 将解压后的目录移动到安装目录 1.4 配置环境变量 修改www.qixoo.qixoo.com/etc/profile文件 ...
- <jsp:invoke fragment=""/>的理解和使用
在传统 JSP 中,想要实现页面布局管理比较麻烦,为了解决在 JSP 中布局的问题,出现了很多开源软件,比如 Apache Tiles 和 SiteMesh 就是其中比较优秀的.但是使用开源软件实现布 ...
- $root knockout
http://www.cnblogs.com/rohelm/p/3209757.html 以列表方式呈现数据 处理以数组形式储存的多条数据,要先认识foreach.在ViewModel定义一个Jav ...
- goto,void,extern,sizeof实例
1.#include <stdio.h>void func(int n){ int* p = NULL; if( n < 0 ) { goto ST ...
- Request.InputStream 接收Post Data
今天 用 Request.Form /Request.Params 等怎么也获取不到客户发过来的Post 数据 后来试着用了 Request.InputStream 竟然可以 using (Syste ...
- Jquery,ajax返回json数据后呈现到html页面的$.post方式。
------------------------------------------------------完整版------------------------------------------- ...
- c# 解析JSON的几种办法(转载)
对比 .NET下几种常见的解析JSON方法 主要类 命名空间 限制 内建LINQ支持 DataContractJsonSerializer System.Runtime.Serialization.J ...
- 部署在IIS上的网站如何调试
引言 今天突然有个朋友问我,总听同事说在IIS中如何如何调试,到底如何调试呢?没办法,人家刚入门,还是亲手给他操作了一遍.也记录一下,希望能帮到那些不知道的孩纸. IIS中的网站调试 调试最常见的一般 ...
- msmms (一) sms与mms区别
sms与mms区别 SMS,Short Messaging Service短信业务,可以通过手机等移动设备发送文本型短信.SMS这个术语最早在80年代初期出现,但一直到了90年代初才开始进入商用市场, ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...