安卓http源码查看器详解

1.效果图如下,输入网址就可以看到该网址的源码

2.项目工程文件如右图所示:

3.首先,布局文件如下,我采用的是线性布局

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     >
 7    <EditText
 8        android:id="@+id/et_info"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:text="http://" />
12     <Button
13         android:onClick="click"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:layout_gravity="center_horizontal"
17         android:text="查看源码" />
18     <ScrollView
19          android:layout_width="match_parent"
20          android:layout_height="match_parent"
21          >
22     <TextView
23         android:id="@+id/tv_info"
24         android:layout_width="match_parent"
25         android:layout_height="match_parent"
26         />
27     </ScrollView>
28
29 </LinearLayout>

4.MainActivity代码如下所示:采用子线程,因为安卓4.0版本以上不支持主线程。

  1 package com.xunfang.look;
  2
  3 import java.io.InputStream;
  4 import java.net.HttpURLConnection;
  5 import java.net.MalformedURLException;
  6 import java.net.URL;
  7 import java.net.URLConnection;
  8
  9 import com.xunfang.service.StreamUtils;
 10
 11 import android.app.Activity;
 12 import android.os.Bundle;
 13 import android.os.Handler;
 14 import android.os.Message;
 15 import android.text.TextUtils;
 16 import android.view.Menu;
 17 import android.view.MenuItem;
 18 import android.view.View;
 19 import android.widget.EditText;
 20 import android.widget.TextView;
 21 import android.widget.Toast;
 22
 23
 24 public class MainActivity extends Activity {
 25     protected static final int SUCCESS = 1;
 26     protected static final int ERROR = 2;
 27     protected static final int FAULED = 3;
 28     private EditText et;
 29     private TextView tv;
 30
 31         //此方法由主线程调用
 32     private Handler handler = new Handler(){
 33         public void handleMessage(Message msg) {
 34             int type = msg.what;
 35             switch (type) {
 36             case SUCCESS:
 37                 String info = (String) msg.obj;
 38                 tv.setText(info);
 39                 break;
 40             case ERROR:
 41                 //Toast.makeText(getApplicationContext(), "网络连接错误,请稍后再试", 0).show();
 42                 String error = (String) msg.obj;
 43                 Toast.makeText(getApplicationContext(), error, 0).show();
 44                 break;
 45             case FAULED:
 46                 String fail = (String) msg.obj;
 47                 Toast.makeText(getApplicationContext(), fail, 0).show();
 48                 break;
 49             default:
 50                 break;
 51             }
 52         };
 53     };
 54     @Override
 55     protected void onCreate(Bundle savedInstanceState) {
 56         super.onCreate(savedInstanceState);
 57         setContentView(R.layout.activity_main);
 58         et = (EditText) findViewById(R.id.et_info);
 59         tv = (TextView) findViewById(R.id.tv_info);
 60
 61     }
 62     public void click(View view){
 63     new Thread(){
 64         public void run(){
 65             //获取路径
 66             String path = et.getText().toString().trim();
 67
 68             if(TextUtils.isEmpty(path)){
 69                 System.out.println("路径不能为空!");
 70             }
 71             try {
 72                 URL uri = new URL(path);
 73                 //连接到服务器
 74                 HttpURLConnection http = (HttpURLConnection) uri.openConnection();
 75                 //设置响应时间
 76                 http.setConnectTimeout(5000);
 77                 //拿到返回的状态码
 78                 int n = http.getResponseCode();
 79
 80                 if(n == 200){
 81                     //接收服务器返回的内容
 82                     InputStream is = http.getInputStream();
 83                     //从流中解析出字符串
 84                     String info = StreamUtils.readStream(is);
 85                     //c创建消息
 86                     Message msg = Message.obtain();
 87                     //设置消息内容
 88                     msg.obj = info;
 89                     //类型
 90                     msg.what = SUCCESS;
 91                     //发送消息
 92                     handler.sendMessage(msg) ;
 93                 }else{
 94                     Message msg = Message.obtain();
 95                     msg.obj = "请求失败";
 96                     msg.what = FAULED;
 97                     handler.sendMessage(msg);
 98
 99                 }
100
101             } catch (Exception e) {
102                 e.printStackTrace();
103                 Message msg = Message.obtain();
104                 msg.obj = "网络不通,请稍后再试";
105                 msg.what = ERROR;
106                 handler.sendMessage(msg) ;
107             }
108         }
109     }.start();
110     }
111
112 }

5.IO流,从给定的流中读取所有的数据转成字符串,因为要接收服务器的数据

 1 package com.xunfang.service;
 2
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6
 7 public class StreamUtils {
 8     //从给定的流中读取所有的数据转成字符串
 9     public static String readStream(InputStream is) {
10             try {
11                 byte[] bs = new byte[1024];
12                 int b = 0;
13                 //捕获内存缓冲区的数据,转换成字节数组
14                 ByteArrayOutputStream boas = new ByteArrayOutputStream();
15
16                 while((b=is.read(bs))!= -1){
17                     /* write(byte[] b, int off, int len),
18                     将指定 byte数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。
19                      b - 数据。
20                     off - 数据的初始偏移量。
21                     len - 要写入的字节数。 */
22                     boas.write(bs, 0, b);
23                 }
24                 boas.close();
25                 return new String(bs);
26
27             } catch (Exception e) {
28                 e.printStackTrace();
29             }
30
31         return null;
32     }
33 }

6,最后就是要哦添加访问网络的权限,配置文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.xunfang.look"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="16"
 9         android:targetSdkVersion="16" />
10     <uses-permission android:name="android.permission.INTERNET"/>
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name=".MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21                 <category android:name="android.intent.category.LAUNCHER" />
22             </intent-filter>
23         </activity>
24     </application>
25
26 </manifest>

7,简单六步就完成了操作。

时间: 2024-10-14 06:48:49

安卓http源码查看器详解的相关文章

android篇-如何做一个简单的安卓源码查看器

1,网页源码查看器: Httpurlconnection:用于发送或接收数据 Mainactivity篇: import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.os.Bundle; import android.os.Handler; import android.os.Lo

linux上源码安装MySQL详解

最近需要使用MySQL Fabric,这货是MySQL5.6.10之后才出现的utility.手头机器装的是MySQL5.1,所以需要先把旧版MySQL升级成5.6版本.之前没有玩过MySQL,所以这次稍微费了点事.在此,把过程记录下来,希望能给有需求的人提供一点帮助.下面我们就正式开始. 1. 删除老版本MySQL 其实删除老版MySQL是一件很简单的事,但是开始时候由于担心各个包的依赖会导致各种问题,亦步亦趋来得很慢.其实只需要做到这么几步就可以了: 1.1 查看已安装的mysql版本并删除

onLayout源码 流程 思路详解(ANDROID自定义视图)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的文章:(ANDROID自定义视图--onMeasure流程,MeasureSpec详解) 而这篇文章就来谈谈第二步:"

【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步

机器学习Spark Mllib算法源码及实战详解进阶与提高视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

网页源码查看器

网页源码查看器 代码实现步骤 [1]搭建UI [2]httpurlconnection类基本用法 @OnClick(R.id.btn) public void onViewClicked() { final String url = mEt.getText().toString().trim(); if (TextUtils.isEmpty(url)) { Toast.makeText(this, "网址不能为空" + url, Toast.LENGTH_SHORT).show();

Spring Boot源码中模块详解

Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1.x 二.模块 Spring Boot 包含许多模块,以下是一些简单的概述: 1,spring-boot 为Spring Boot其他部分功能提供主要的lib包,其中包含:(1)SpringApplication类提供了静态便利的方法使编写独立的SpringApplication更加容易.它唯一的任

NGINX源码安装配置详解(./configure),最全解析

NGINX ./configure详解 在"./configure"配置中,"--with"表示启用模块,也就是说这些模块在编译时不会自动构建"--without"表示禁用模块,也就是说这些模块在编译时会自动构建,若你想Nginx轻量级运行,可以去除一些不必要的模块. [[email protected] nginx-1.14.0]# ./configure --help => 查看安装配置项 --help 打印帮助信息. --prefix

Android源码目录结构详解

Android |– Makefile |– bionic (bionic C库) |– bootable (启动引导相关代码) |– build (存放系统编译规则及generic等基础开发包配置) |– cts (Android兼容性测试套件标准) |– dalvik (dalvik JAVA虚拟机) |– development (应用程序开发相关) |– external (android使用的一些开源的模组) |– frameworks (核心框架--java及C++语言) |– ha