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天前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
8天前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
14天前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
14 3
|
18天前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
27天前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
34 6
|
11天前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
24 0
|
13天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
1月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
66 2
|
17天前
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
26 0
|
21天前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
23 0

热门文章

最新文章