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;

    }

}

 

目录
相关文章
|
8月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
285 23
|
8月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
214 15
|
10月前
|
机器学习/深度学习 监控 算法
基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
本项目基于YOLOv4深度学习网络,利用MATLAB 2022a实现排队人数统计的算法仿真。通过先进的计算机视觉技术,系统能自动、准确地检测和统计监控画面中的人数,适用于银行、车站等场景,优化资源分配和服务管理。核心程序包含多个回调函数,用于处理用户输入及界面交互,确保系统的高效运行。仿真结果无水印,操作步骤详见配套视频。
279 18
|
11月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于yolov4深度学习网络的公共场所人流密度检测系统matlab仿真,带GUI界面
本项目使用 MATLAB 2022a 进行 YOLOv4 算法仿真,实现公共场所人流密度检测。通过卷积神经网络提取图像特征,将图像划分为多个网格进行目标检测和识别,最终计算人流密度。核心程序包括图像和视频读取、处理和显示功能。仿真结果展示了算法的有效性和准确性。
273 31
|
11月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
385 3
|
12月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
165 6
|
12月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
440 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
数据可视化 前端开发
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
本文介绍了如何在Twaver-HTML5中使用鹰眼(Overview)可视化视图组件,它作为Network的缩略图,允许用户通过缩略图导航Network,支持单击、双击和框选操作来控制Network视图。
261 5
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
481 7
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面

热门文章

最新文章

下一篇
开通oss服务