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" 建议直接查看源代码文 ...
随机推荐
- Android中调用百度地图
一.调用百度地图 --第一种方法 1.下载百度地图SDK SDK可以拆分下载,需要使用那一部分功能就下载相应包含的SDK,如下图 核心的的jar 和so包,放在工程中的libs目录下 2.申请key ...
- ci创建zip
public function createZip() { $this->load->library("zip"); $name = "test.text&q ...
- PHP高效率写法(详解原因)
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...
- Jenkins 搭建U3D自动发布 IOS
http://www.cnblogs.com/yinghuochong/archive/2013/09/01/3294940.html 1.安装包,工具略过. 2.插件管理 Subversion Pl ...
- NoClassDefFoundError: org/slf4j/LoggerFactory解决
缺少slf4j-api-1.5.2,slf4j-log4j12-1.5.2,log4j-1.2.8这几个包,导入即可
- JQuery元素获取
前言:这是本类别博文JQuery即用即查开篇. 因为查手册太麻烦,而且有时候需要深入命令所在详细页面才能了解此命令的具体作用是什么. 写这几篇文章就是为了,工作遇到问题时,一看这几篇文章就可以查到哪个 ...
- 保存知乎收藏夹功能的NodeJS版本
前两天发现知乎收藏夹中的答案正在不断减少..看来需要保存一下了,但之前别人的方式是用chrome插件(浏览器无法自动保存本地文件)+wget前后端配合来完成这个工作的,而且还有一些缺点(比如保存的ht ...
- ExtJS学习之路第一步:对比jQuery,认识ExtJS
最近纷杂的事情比较多了,奔波ing!所以,Node.js 和Canvas动画系列都停止了,等稳定了再重拾书本继续学习!因为某种原因最近在看ExtJS,分享下学习的心得,希望对同道中人有所帮助. 第一用 ...
- linux服务器部署svn常见错误处理→转载
转载地址→http://blog.seweal.com/post/2013-02-04/svn-errors [开放svn端口] iptables -I INPUT -p tcp --dport 36 ...
- iOS设备屏幕像素总览
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011728.html ,转载请注明出处. 本文永久地址为http://www.cnblogs.com/Ch ...