Android开发之基础------------------网络编程(一)

Android网络编程基础(一) - 基础知识 内容介绍:Android网络编程基础 博客地址:http://blog.youkuaiyun.com/kevindgk 版权声明:本文为原创文章,未经允许不得转载 联系方式:815852777@qq.com 前言 推荐书籍 基础知识 计算机网络概述 OSI参考模型和TCPIP模型 IP地址和端口号 端口号 单播组播广播 Android基本网络支持 获取网络基本信息 Socket相关 TCP通 阅读详情


一、获取请求网页的响应源码(网页源码查看器)

步骤:

1.写布局文件       布局文件说明:文本输入框用于输入请求的地址       设置按钮用于点击获取网页源码     显示在文本域中   文本域设置为带滚动条

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_inputurl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入url" />

    <Button
        android:id="@+id/bt_getsource"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:text="获取源码" >
    </Button>

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

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tv_showsource"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

逻辑部分:1.获取控件   设置按钮点击事件(获取源码)     使用handler处理UI更新操作(将获取的源码显示到文本域中)      

package com.itheima.sourcecode_look;

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

import com.itheima.sourcecode_look.utils.StreamUtils;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

	private EditText et_inputurl;
	private Button bt_getsource;
	private TextView tv_showsource;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//找到控件设置点击事件
		et_inputurl = (EditText) findViewById(R.id.et_inputurl);
		bt_getsource = (Button) findViewById(R.id.bt_getsource);
		tv_showsource = (TextView) findViewById(R.id.tv_showsource);
		bt_getsource.setOnClickListener(this);
		System.out.println("oncreate:"+Thread.currentThread().getName());

	}
	
	
	//***1.在主线程创建一个Handler对象
	Handler handler = new Handler(){
		
		//***2.重新handlerMessage方法
		public void handleMessage(android.os.Message msg) {
			//***5.主线程的handler对象中的handleMessage方法接收子线程发来的Message对象,获取message携带的数据,并处理数据
			String result = (String) msg.obj;
			//7.显示到textView上
			tv_showsource.setText(result);
			
		};
		
	};
	
	@Override
	public void onClick(View v) {

		
		
		//获取用户输入的url
		final String url_str = et_inputurl.getText().toString().trim();
		
		//由于4.0之后网络请求需要放到子线程,所以创建子线程执行网络请求
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				

				//请求服务器获取源码
				try{	
					//1.获取一个URL对象
					URL url = new URL(url_str);
					//2.通过URL对象得到一个HttpURLConnection对象
					HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();
					//3.设置HttpUrlConnection的一些参数,如:连接的超时时间,请求方式
					openConnection.setRequestMethod("GET");//设置连接的请求方式,类型一定要大写
					openConnection.setConnectTimeout(10*1000);//设置连接的超时时间
					//4.获取服务器响应的状态码,并判断
					int code = openConnection.getResponseCode();
					System.out.println("onclick:"+Thread.currentThread().getName());
					
					if(code == 200){//200 成功 206 请求部分资源成功   300 跳转  400 失败  500 服务器异常
						//5.得到连接的读取流,获取服务返回的内容。
						InputStream inputStream = openConnection.getInputStream();
						String result = StreamUtils.streamToString(inputStream);
						
						//***3.在子线程创建一个Message对象,用来携带子线程处理的结果
						Message msg = new Message();
						msg.obj  =  result;
						//***4.通过主线程创建的Handler来发送message对象到主线程
						handler.sendMessage(msg);
						
						//6.关闭链接 关闭流
						openConnection.disconnect();
						inputStream.close();	
					}
				
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
}
工具类:将字节流转换成字符串

package com.itheima.sourcecode_look.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamUtils {

	public static String streamToString(InputStream inputStream) {
		ByteArrayOutputStream  out = null;
		try{

			//创建一个内存写入流
			out = new ByteArrayOutputStream();

			byte[] buffer = new byte[1024];
			int len  = -1;
			while((len = inputStream.read(buffer)) != -1){
				out.write(buffer, 0, len);
				out.flush();
			}

			return out.toString();
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

}
注意事项:

1.ANR异常: anr(application not response)  主线程不能做耗时的操作(网络请求,大文件的拷贝,数据库的操作)
09-14 01:46:43.352: E/ActivityManager(858): ANR in com.itheima.sourcecode_look (com.itheima.sourcecode_look/.MainActivity)

2.网络运行在主线程异常。4.0版本之后google强制要求网络请求在子线程执行。
09-14 01:52:48.813: W/System.err(698): android.os.NetworkOnMainThreadException


3. 错误的线程调用异常:子线程不能够修改UI界面
09-14 01:57:06.213: W/System.err(764): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


结论:主线程不能够做耗时的操作,耗时的操作需要放到子线程做,但是子线程又不能更新UI(改变控件的内容和样式).  使用Handler解决这个问题。
Handler:消息处理机制   用于解决子线程不能更新UI。

写法步骤:

1.在主线程创建一个Handler对象
2.重写handler对象的handlerMessage方法
3.在子线程中创建一个Message对象用来携带子线程处理的结果。
4.使用主线程创建的handler在子线中将message发送到主线程
5.主线程中handler对象的handlerMessage方法接受子线程发送的Message对象,
获取message对象携带的数据,并处理UI界面的显示 

代码体现:

//***1.在主线程创建一个Handler对象
				Handler handler = new Handler(){
					
					//***2.重新handlerMessage方法
					public void handleMessage(android.os.Message msg) {
						//***5.主线程的handler对象中的handleMessage方法接收子线程发来的Message对象,获取message携带的数据,并处理数据
						String result = (String) msg.obj;
						//7.显示到textView上
						tv_showsource.setText(result);
						
					};
					
				};

//***3.在子线程创建一个Message对象,用来携带子线程处理的结果
						Message msg = new Message();
						msg.obj  =  result;
						//***4.通过主线程创建的Handler来发送message对象到主线程
						handler.sendMessage(msg);


做个努力奋斗的男子汉,实现自己一个又一个梦想吧,走在实现梦想的路上,浑身充满了能量!加油吧,越努力越幸运。

2015-10-3  北京市海淀区

Android开发笔记之网络编程 前言 对于一个开发而言,网络编程是必要技能,小编我今天给大家介绍一下Aandroid的网络编程。主要包括,Socket编程, UDP/TCP Socket编程 Http协议 UDP/TCP OkHttp编程 现在Android网络编程已经摒弃了apache的httpclient和Android自身的URLConnection,强烈推荐Okhttp,而且市面上常用的app也是使用Okhttp,比如美... 阅读详情

相关推荐

Android应用开发:网络编程-2

网络编程 Java基础:网络编程 Uri、URL、UriMatcher、ContentUris详解 Android应用开发:网络编程1 Android应用开发:网络编程2 1. 使用HttpClient发送get请求HttpClient是Apache开发的第三方框架,Google把它封装到了Android API中,用于发送HTTP请求。在Android.jar包中,可以看到有很多java的API,

JackChan 2147

【安卓开发】安卓网络编程

既然要刷新,就必然会用到sleep()方法去睡眠等待刷新时间,但是在之前我们曾经出错过,如果我们想要不断刷新修改一个控件(比如文本控件)的内容,我们应该如何做呢?我们可以看到,程序又崩溃了。......

qq_62361050的博客 1409

安卓学习笔记42:基于HTTP网络编程

利用URLConnection和HttpClient访问网络资源

howard2005的专栏 1415

Android 网络编程入门指南

在移动应用开发中,网络编程是一个不可或缺的部分。它允许应用与远程服务器进行数据交换,实现数据的上传和下载。本文将为你提供一个关于Android网络编程的入门指南,帮助你理解基本概念和实现步骤。

Unity打怪升级 2327

安卓学习笔记40:基于套接字网络编程

1. 了解基于套接字网络有两种传输模式; 2. 掌握基于TCP/IP协议的套接字网络编程

howard2005的专栏 2343

Android网络编程基础与实战详解

随着移动互联网的飞速发展,Android应用已广泛依赖于网络通信来实现数据交互与业务逻辑。Android网络编程作为应用开发的核心组成部分,承担着与服务器端交互、获取实时数据、用户认证、推送通知等关键任务。本章将从网络编程的基本概念入手,剖析其在Android平台上的发展背景与技术演进,探讨移动设备在复杂网络环境下的通信需求与挑战,如弱网环境、数据安全、异步处理等。通过本章学习,读者将建立起对Android网络请求的全局认知,为后续深入掌握具体实现方式打下坚实基础。当需要更灵活的线程控制时,可以使用。

weixin_42600128的博客 1146

android 获取当前webview显示的网页的源码和网页中框架的源码

如果是仅仅是为了获取网页的源代码的话,可以参考这篇文章:Android: 在WebView中获取网页源码但是,我遇到的情况是网页中套用了框架,仅仅查看网页源代码是不能得到我想要的数据的,需要获得框架的源代码,经过多次测试,终于找到解决办法。 废话不多说,直接上代码: 自定义WebViewClient代码:public class MWebViewClient extends WebViewCli

老黑牛 6790

14天精通安卓开发基础

本文还有配套的精品资源,点击获取 简介:在14天内,本课程计划帮助具备Java基础的学习者高效掌握安卓开发。学习者将了解Android SDK、Android Studio IDE、安卓四大组件(Activity、Service、BroadcastReceiver、ContentProvider)、界面布局设计、应用生命周期管理、Intent通信机制、SQLite数据库应用...

weixin_36204513的博客 851

Android 使用JS注入获取网页视频链接

Android 使用JS注入获取网页视频链接 思路: 1、通过js注入获取整个网页html。 2、通过jsoup分析获取video播放器的数据源。 一、开启webviewjs功能,注入js回调 mWebView.addJavascriptInterface(new LocalAndroidObj(), "local_android_obj");// js 注入回调 二、通过jsoup 分析网页,使用方法类似jQuery语法。 private class LocalAndroidObj{

一航jason 2975

Android系统开发全面指南:从基础到高级实践

本文还有配套的精品资源,点击获取 简介:《Android从入门到高手进阶(长青说安卓系列)》是一套全面覆盖Android开发核心内容的学习资源,适合初学者到高级开发者。内容包括环境搭建、Java与Kotlin基础、SDK组件、UI设计、Intent机制、数据存储、网络编程、权限管理、多媒体处理、通知与推送、性能优化、测试、组件化与模块化开发、Gradle构建系统,以及关注最...

weixin_28681379的博客 1531

精通Java安卓开发:Android Studio飞机大战实战项目

Java是一种广泛使用的面向对象的编程语言,以其”一次编写,到处运行”的特性而闻名。它被设计为拥有尽可能少的实现依赖性,从而让程序能够在各种处理器上编译运行。Java的发展历程中衍生出了丰富的生态和工具集,为开发各种应用程序提供了强大支持。在深入Android开发前,理解SDK和NDK的区别尤为重要。SDK是Software Development Kit的缩写,指的是软件开发工具包,它包含了一系列开发特定软件所需的工具、文档、代码库等。

weixin_42476987的博客 813

Android应用开发基础之四:网络编程(一)

网络图片查看器 确定图片的网址 发送http请求 URL url = new URL(address); //获取连接对象,并没有建立连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置连接和读取超时 conn.setConnectTimeout(5000); conn....

weixin_30421525的博客 171

安卓APP开发:WiFi彩灯控制系统的毕业设计

安卓(Android)是当今最流行的移动操作系统之一,广泛应用于手机、平板电脑等各种智能设备。安卓应用开发涉及到对安卓SDK(软件开发包)的使用,以及对Java或Kotlin等编程语言的熟悉。开发者需要掌握安卓的基础架构,包括操作系统、中间件以及核心应用程序。安卓应用开发流程包括需求分析、设计、编码、测试和部署。在编码阶段,开发者将通过编写Java或Kotlin代码、使用XML布局文件来构建应用的界面和逻辑。

weixin_34779181的博客 1069

Android详细开发教程,本文章将带你更深入的学习安卓开发

安卓开发是一项充满挑战和乐趣的技能,它可以让你创建各种类型的移动应用,从简单的工具到复杂的游戏,本文章将为你提供一个详细的学习路线,参考内容,应用场景,实用案例及代码示例,以及一些优秀的GitHub开源项目,帮助你深入掌握安卓开发!

HSX的博客 4719

手把手教你用 Docker 构建自己的 CentOS 基础镜像

目录一、准备CentOS基础镜像二、撰写Dockerfile三、构建Docker镜像四、生成Docker容器 相信码农们经常会听说:虚拟机将成为历史,Docker才是未来 !!! 事实如此,现在大部分公司都在用 Docker 技术,想拥有自己的 Docker 专属镜像,那么 Dockerfile 就是入门,现在让我们一起来看一下 ------ 构建 Docker 镜像的全过程。 好文章 记得收藏...

Nick.Peng's Blogs 1万+

超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库

本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置

2301_79998006的博客 1078

安卓网络编程——HttpURLConnection

部分案例需要一定的XML和JSON解析知识 https://blog.youkuaiyun.com/nishigesb123/article/details/89190973 Socket、TCP、HTTP等等概念搞不清区别的可以先走下面的链接(好像也是转的,不过贴的几张图很好) https://www.cnblogs.com/merray/p/7918977.html 暂时不涉及Socket部分的内...

旧日灯塔 2553

Anchor graph 对齐文献解读

Align then Fusion: Generalized Large-scale Multi-view Clustering with Anchor Matching Correspondences文献解读

atease0001的博客 1163

02 java ---- Android 基础app开发

/ 自定义的点击事件处理类,实现了View.OnClickListener接口 继承@Override//方法重写触控事件 有触控这日志输出 没用toast因为toast得调用主函数中//Toast.makeText(this, "按键一被按下", 0).show();//没用toast因为toast得调用主函数中System.out.println("按键一被按下");break;//Toast.makeText(this, "按键二被按下", 0).show();

prppr_的博客 7679

【微信读书】数据内容接口逆向解析实战:从请求捕获到文本提取

本文详细解析了微信读书网页版数据内容接口的逆向工程实战过程。通过浏览器开发者工具捕获网络请求,定位关键API接口,并深入JavaScript代码分析数据解析逻辑,最终实现从请求模拟到文本提取的完整流程。文章旨在技术学习,探讨Web应用数据交互原理,帮助开发者理解现代前端数据流与编码机制。

game4的博客 420

SuccessFactors入门篇

SuccessFactors入门篇—— Employee Central(一)最近通过一个月左右的学习,拿到了SF EC(SuccessFactors Employee Central )模块SAP认证,所以打算把自己学习SF的整个过程以及相关资料和大家分享一下,相互切磋,共同进步。Employee Central简单了解Employee Central简单了解新的改变功能快捷键合理的创建标题,有...

qq_42288853的博客 1万+

南邮Android实验报告二:安卓网络编程

南邮Android实验报告二:安卓网络编程

weixin_45700663的博客 2130

Debezium报错处理系列之二十一:Unable to connect: Communications link failure.The driver has not received any

Debezium报错系列之二十一:Unable to connect: Communications link failure.The driver has not received any。

zhengzaifeidelushang的博客 546

Android基础——网络编程

网络编程网络编程和数据解析是什么?WebView三级目录 网络编程和数据解析是什么? 网络编程指Android系统使用http协议和服务器交互,并对服务器返回的数据(xml、json)进行解析 WebView Web控件可以让我们在应用程序中嵌入浏览器,展示网页信息 修改activity_main.xml: 三级目录 ...

松仔Log的博客 2566

dy创作者平台上传并发布视频

整体上来说不是很难,就是过程有点复杂。因为这个是别人给的单子,所以这里不放源码了。细致一点就可以搞定。如果要Signature算法,可私信,不免费。

记录一些web逆向的过程 1515

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。

智慧空间实验室 4639
上一篇: java中内部方法对外部类变量的引用
下一篇: Android开发之基础-------------Get请求和Post请求
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值