10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用

简介: 编写如下项目:2 编写Android清单文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.itheima28.htmldemo"

  1. 编写如下项目:

2 编写Android清单文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheima28.htmldemo"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.INTERNET"/>

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheima28.htmldemo.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

</manifest>

3 编写布局文件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=".MainActivity" >

   

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

       

        <EditText

            android:id="@+id/et_url"

            android:layout_width="0dip"

            android:text="http://www.baidu.com"

            android:layout_height="wrap_content"

            android:singleLine="true"

            android:layout_weight="1"/>

       

        <Button

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:onClick="getHtml"

            android:text="GO"/>

    </LinearLayout>

 

    <ScrollView

        android:layout_width="fill_parent"

        android:layout_height="fill_parent">

      

        <TextView

            android:id="@+id/tv_html"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"/>

    </ScrollView>

   

</LinearLayout>

4 编写Activity的类MainActivity如下:

package com.itheima28.htmldemo;

 

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 {

 

    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;

    }

}

 

目录
相关文章
|
2月前
|
移动开发 JavaScript Java
关于Android中如何过滤HTML标签
关于Android中如何过滤HTML标签
46 0
|
30天前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
115 56
|
9天前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
1月前
|
前端开发
HTML+CSS基础知识(4)简单的广告界面
这篇文章通过代码示例演示了如何使用CSS样式来美化网页布局,包括清除默认样式、设置页面字体、调整标题和内容的样式,以及为超链接添加悬停效果。
HTML+CSS基础知识(4)简单的广告界面
|
22天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
21天前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
22天前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!
|
30天前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
28 0
|
30天前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
24 0
|
30天前
|
Java Android开发 开发者
Android项目架构设计问题之使用Retrofit2作为网络库如何解决
Android项目架构设计问题之使用Retrofit2作为网络库如何解决
30 0