android(20)(从网络抓取html显示在本地,把流转换成String,请求网络,简单的消息处理机制,编码问题)
2015-12-05 11:44
851 查看
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); } //得到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; }
相关文章推荐
- Linux网络服务之DNS
- 对李博士随机网络网络演算学位论文的学习
- 项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
- android(19)(两种方式从网络抓取图片显示在本地)
- 从epoll构建muduo-11 单线程Reactor网络模型成型
- VC多线程编程(转载)http://www.cnblogs.com/xmsnzs/articles/1267436.html
- 深入分析JavaWeb Item8 -- HttpServletResponse常见应用
- 深入分析JavaWeb Item7 -- HttpServletResponse详解
- TCP建立连接和拆除连接的过程
- Linux的常用命令1---网络相关(不断添加中)
- javaweb学习总结(四)——Http协议
- http压力测试工具及使用说明
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- CNN(卷积神经网络)在视频动作分类中的应用
- 一个用于网络请求的类
- 42.网络请求POST同步和异步
- iOS之网络数据缓存
- ASIHTTPRequest类库简介和使用说明
- Hyper-v Server 网络管理
- Hyper-v Server 网络管理