(十三)网络html查看器

一:此节的重点部分:如何把输入流的数据转化为字符串功能的实现,详情见五:StreamTools.java。注意:访问网络一定要加权限:    <uses-permission android:name="android.permission.INTERNET" />

功能需求:在EditText输入网址,点击浏览将可以查看到一个网页的html文件。程序运行结果如下所示:

二:整个程序的结构图如下所示:

三、activity_main.xml文件的具体代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.htmlview.MainActivity" >

    <EditText
        android:id="@+id/et_path"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入网址"
        android:text="http://www.cnblogs.com/fuyanan/p/4080201.html" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="浏览" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </ScrollView>

</LinearLayout>

四、MainActivity.java代码如下所示:

package com.example.htmlview;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import com.example.htmlview.utils.StreamTools;

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 ERROR = 1;
protected static final int SHOW_TEXT = 2;
protected static final String TAG = "MainActivityHtml";
private EditText et_path;
private TextView tv_content;
private Handler handler=new Handler(){

    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        switch (msg.what) {
        case ERROR:
            Toast.makeText(MainActivity.this, "获取网络资源失败", 1).show();
            break;
        case SHOW_TEXT:
            tv_content.setText((CharSequence) msg.obj);
            break;

        }
    }

};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_path=(EditText)findViewById(R.id.et_path);
        tv_content=(TextView)findViewById(R.id.tv_content);
    }

    public void click(View view){
        final String path=et_path.getText().toString().trim();
        if(TextUtils.isEmpty(path)){
            Toast.makeText(this, "网络地址不能为空", 1).show();
            return;
        }else{
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        URL url=new URL(path);
                        Log.i(TAG, "getResponseCode"+ url);
                        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
                        Log.i(TAG, "getResponseCode");

                        conn.setRequestMethod("GET");
                         conn.setConnectTimeout(5000);
                         int code=conn.getResponseCode();
                         if(code==200){
                             InputStream is=conn.getInputStream();  //得到服务器端返回来的输入流
                             String result=StreamTools.ReadInputStream(is);
                             Message msg=new Message();
                            msg.what=SHOW_TEXT;
                            msg.obj=result;
                            handler.sendMessage(msg);

                         }else{
                              Log.i(TAG, "code != 200");
                             Message msg=new Message();
                            msg.what=ERROR;
                            handler.sendMessage(msg);
                         }

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                         Log.i(TAG, "Exception");
                        e.printStackTrace();
                        Message msg=new Message();
                        msg.what=ERROR;
                        handler.sendMessage(msg);
                    }
                }
            }).start();
        }
    }
}

五、StreamTools.java文件

package com.example.htmlview.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteOrder;

public class StreamTools {

    /**
     * 把输入流的数据转化为字符串
     *
     * @param is
     *            输入流
     * @return 字符串
     */
    public static String ReadInputStream(InputStream is) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            is.close();
            baos.close();
            byte[] result = baos.toByteArray();
            return new String(result);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "将输入流转化为字符串失败";
        }
    }
}
时间: 2024-10-12 04:07:07

(十三)网络html查看器的相关文章

无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下: private static final Uri URI = Uri.parse("content://person.db"); public class

Android 网络HTML查看器

本文实现一个基于Android的网络HTML查看器 新建项目,项目布局文件如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=&qu

网络html查看器

1)演示效果: 2代码演示:实现的机制的原理:android的消息处理机制原理 实现把内容转换成String字符编码: 配置权限: 主类: ----实现机制--android消息处理机制原理

android 网络_网络图片查看器

xml <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="

第一篇:实时网络日志分析器和交互式查看器--GoAccess安装

介绍 GoAccess是一个开源的实时网络日志分析器和交互式查看器,可以在* nix 系统或通过浏览器的终端中运行. 它为需要动态可视化服务器报告的系统管理员提供快速且有价值的HTTP统计信息. 特征 GoAccess的一些功能 1.实时输出 2.允许任何自定义日志格式字符串 3.跟踪应用响应时间 4.只有一个依赖,GoAccess是用C语言编写的.要运行它,你只需要将ncurses作为依赖项. 5.增量日志处理 需要最少的配置 7.可以将日志分析输出成多种格式.HTML,JSON.CSV 需要

安卓开发教程-实战网页源代码查看器,安卓程序员必备

本系列教程致力于可以快速的进行学习安卓开发,按照项目式的方法,通常一篇文章会做一个小程序.提高学习的兴趣. 一方面总结自己所得,另一方面可以通过自己的分享帮助更多学习的同仁. 因为知识的连贯性,推荐按照瞬息进行学习.目录链接:http://www.chengxiaoxiao.com/bozhu/1336.html 本教程由今日头条-做全栈攻城狮原创首发,转载请注明出处. 求兼职:请联系wx:aiquanzhan 页尾提供github源代码下载地址. 一.项目描述: 众所周知,组成网站的每个页面都

发布两款JQ小插件(图片查看器 + 分类选择器),开源

图片查看器,github地址:https://github.com/VaJoy/imgViewer 效果如下: 这款当初大概写了2小时,有点匆忙地赶出来的,使用的接口很简单: $.bindViewer(".viewer-item"); 它的实现其实也没啥复杂的原理,唯一觉得可说的地方是图片展开的过程 —— 从小变大动态过程的实现.主要是靠这一段代码实现的: $(this).css({"top": win_h / 2 + sroll_t, "margin-l

(十二)网络图片查看器(注释更全面)

(一)android:layout_weight 在不同情况下的意义. 当 android:layout_width  和 android:layout_height都不为0的时候,android:layout_weight代表的是控件渲染的优先级,值越大,渲染的优先级越低.默认android:layout_weight=0. 当 android:layout_width  或 android:layout_height为0的时候,android:layout_weight才代表权重,值越大,权

Android仿微信朋友圈图片查看器

转载请注明出处:http://blog.csdn.net/allen315410/article/details/40264551 看博文之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个"九宫格"的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下.首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Roo