Android中访问HTML源码并解决编码问题
来源:互联网 发布:农大网络远程教育 编辑:程序博客网 时间:2024/06/04 15:16
本案例功能为在输入框中输入网址并点击按钮,访问HTML源代码并显示在TextView中。为了避免服务器端编码与客户端不同,需要对返回的HTML代码内容(标签)进行判断,采用与服务端对应的编码进行解析。
实现步骤:
1. 定义函数String getHtmlFromInternet(String url),用于根据给定的url访问网络,抓取html代码。函数的内容很简单,仍然是定义HttpURLConnection对象,并配置各项参数,然后用connect进行连接。如果连接成功,调用String getStringFromInputStream(InputStream is)来将流转换为字符串。
2. 在getStringFromInputStream(InputStream is)方法中,主要做以下几件事:(1)写入缓存流;(2)在html中的内容中,抽取编码信息,并做相应选择判断。(3)根据编码信息做对应编码种类的字符转换,得到String类型的输出字符html并返回。
3. 用户点击按钮响应getHtml()方法。在这个方法中开启一个子线程,接收返回到的html字符,如果不为空,那么将通过handler向主线程发送成功消息并传递html字符串。主线程将字符串显示在UI中。
MainActivity.class
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity { protected static final int SUCCESS = 0; protected static final int ERROR = 1; private static final String TAG = "MainActivity"; 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((CharSequence) 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); } /**按钮点击,调用该方法。 * * @param v */ 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)) { 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); 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(); //把流中的数据转换成字符串 String charset = "utf-8"; if(html.contains("gbk") || html.contains("gb2312") || html.contains("GBK") || html.contains("GB2312")) { //如果包含gbk编码,就采用gbk编码对字符串编码 charset = "gbk"; } html = new String(baos.toByteArray(), charset); //按charset代表的编码种类进行编码,得到String类型的html baos.close(); return html; }}
0 0
- Android中访问HTML源码并解决编码问题
- 解决Ubuntu升级12.10后无法编码Android源码问题
- HTML编码问题--IE中编码问题
- 解决Android开发中加载html页面乱码的问题
- MvcHtmlString解决MVC中从后台返回HTML代码被编码问题
- linux系统中mysql修改密码并设置远程访问和解决mysql乱码问题
- 解决java用url中读取html源码时的乱码问题
- 从post获取的html源码的编码问题
- 如何在ubuntu10.04下载android4.0的源码(并解决以往无法下载android源码的问题)
- 如何在ubuntu10.04下载android4.0的源码(并解决以往无法下载android源码的问题)
- HTML 字符编码 设定(解决可能引起中文乱码问题)
- 解决一些android studio 中的编码问题
- 终于解决了JSP中编码问题~~~~~~~
- Myeclipse中编码问题汇总解决
- php开发中编码问题的解决
- javadoc 使用中解决不能编码问题
- 解决python源代码中编码问题
- JSP中编码格式问题的解决
- 网站新手引导(js+jquery)
- 87. Scramble String
- Golomb 编码
- 64位CentOS6.5搭建LAMP环境详细步骤
- 【Lua】【2】Lua基本的函数和控制结构
- Android中访问HTML源码并解决编码问题
- hudson部署
- vim 快捷键(图)
- 在android 输入框中判断表情
- telnet退出命令
- 知名的第三方开源库
- Problem C: P1053
- [leetcode-75]Sort Colors(C)
- Mavan配置