我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android网络编程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android网络编程

Android网络编程目录小朋友你是不是有很多问号???一、网页源码查看器二、消息机制的写法(重点)1、相关概念2、Handler的使用3、消息机制的原理三、图片查看器四、runOnUiThread的写法五、Handler中的api六、案例:新闻客户端1、安装tomcat2、写新闻客户端3、smartimageview4、自定义smartimageview七、三种提交数据到服务器的方式1、使用HttpURLConnection方式把数据提交到服务器2、接口HttpClient3、使用开源项目AsyncHttpClient八、多线程下载1、多线程下载原理2、多线程下载步骤九、断点续传1、在多线程下载的功能上增加断点续传的功能2、开源项目实现多线程下载/断点续传@CopyRight 名侦探柯小启 小朋友你是不是有很多问号??? 一、网页源码查看器
安装查看源码的软件httpwatch(这里就没安装了)
在浏览器中按快捷键shift+F2	调用httpwatch
//创建URL对象,指定我们要访问的网址路径
URL url = new URL(path);
//拿到HttpURLConnection对象,用于发送或者接收数据extends URLConnection 
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置发送get请求
conn.setRequestMethod("GET");//get需要大写,默认就是get,也可以不写此行
//设置请求超时时间
conn.setConnectTimeout(5000);//5秒
//获取服务器返回的状态码
int code = conn.getResponseCode();
if(code == 200){
//获取服务器返回的数值,是以流的形式返回的,把流转换为字符串是一种常见的操作,因此将其设置为一个utils
InputStream in = conn.getInputStream();
//使用我们定义的工具类,把InputStream转为String
String content = StreamToString.readStream(in);
//把流里面的数据显示在textView上
tv_content.setText(content);
//需要加上权限:android.permission.INTERNET
控件ScrollView里面只能包含一个孩子
二、消息机制的写法(重点)

**规则:**1、不管是什么版本的手机,只要做耗时的操作(比如连接网络,拷贝大的数据,Thread.sleep()等)就自己开一个子线程;2、获取数据后想要更新UI,就使用Handler就可以了。

1、相关概念
1、anr	Application not response	应用无响应	主线程(UI线程)
2、如果在主线程中进行了耗时的操作(比如连接网络 拷贝大的数据,Thread.sleep()等)
3、为了避免anr,可以把耗时的操作放到子线程中(自己创建一个子线程)
4、在4.0之后,谷歌强制要求连接网络不能在主线程进行访问
所以创建一个子线程
// 创建一个子线程
		new Thread() {
			public void run() {
			...内容
			};
		}.start();
也可以在ACtivity的onCreate()方法中加入这样一段代码,适用于网络请求数据量很小的,如下
 if (android.os.Build.VERSION.SDK_INT > 9) {
		 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
		 StrictMode.setThreadPolicy(policy);
		 }
04-10 02:01:57.297: W/System.err(789): android.os.NetworkOnMainThreadException
5、只有主线程(UI线程)才可以更新UI
所以定义一个Handler
04-10 02:28:07.306: W/System.err(1392): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
2、Handler的使用
protected static final int REQUESTSUCCESS = 0;// ctrl+shift+x 大写 y:小写

//定义一个Handler,重写其中的handleMessage方法
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			String content = (String) msg.obj;//获取msg中的数据
			tv_content.setText(content);//在主线程中更新UI,将获得的数据显示在控件上
		};
	};

//创建message对象
Message msg = new Message();//或者使用 Message.obtain()方法获得Message对象;
msg.what = REQUESTSUCCESS;// 给这个消息指定一个标识,代表是哪条消息,为int类型
msg.obj = content;//把数据放到msg中
//拿着我们创建的handler,告诉系统,我们要更新UI
handler.sendMessage(msg);//发送消息,相应的handleMessage这个方法就会执行
3、消息机制的原理

Handler的作用是用来发消息和处理消息的

Looper的作用是去消息队列(messagequeue)里面取消息,交给handler中的handleMessage方法处理

Looper在主线程创建的时候,就有了

4、cache和file目录

cache:cache存放缓存的临时数据。

file:file中存放重要数据。

四、runOnUiThread的写法 如果仅仅是更新ui,那么就用runOnUiThread这个api就可以 有的时候需要通过Handler发送消息,携带数据,这时候必须使用Handler
runOnUiThread(new Runnable() {
		public void run() {	//该run()方法是谷歌工程师封装好的,可以在其中更新ui
		iv.setImageBitmap(bitmap);
		Toast.makeText(getApplicationContext(),"查看图片成功", 0).show();
}
});
五、Handler中的api

类似java基础中的Timer

// 5秒后执行run(),这个run()是谷歌封装好的方法,可以更新UI
		new Handler().postDelayed(new Runnable() {
			public void run() {
				System.out.println("哈哈哈");
				tv.setText("哈哈哈哈哈啊,I am coming home!");
			}
		}, 5000);
// java基础中的timer(定时器)方法,该方法三秒后,每隔三秒执行一次这个方法
// 这个run()方法相当于子线程,不能更新UI,所以要加上runOnUiThread方法
		Timer timer = new Timer();
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				System.out.println("嘿嘿嘿");	//打印出log
				runOnUiThread(new Runnable() {
					public void run() {
							tv.setText("嘿嘿嘿,I am coming home!");//更新ui
					}
				});
			}
		};
		timer.schedule(task, 3000, 3000);
	}
六、案例:新闻客户端 1、安装tomcat
//启动tomcat
1、先在cmd下的/bin目录下	service.bat install
2、点击bin目录下的tomcat8w.exe,开启tomcat//如果点击tomcat8w.exe闪现则执行第一条,否则忽略第一条
//测试tomcat是否安装成功
http://localhost:8080	//如何出现小猫图案则安装成功
//在tomcat的ROOT目录下加入内容,即可通过网址访问,本地的服务器
D:\tomcat\apache-tomcat-8.5.43\webapps\ROOT
//localhost表示本地的服务器
http://localhost/baby.jpg
//192.168.1.104本机ip地址
http://192.168.1.104:8080/baby.jpg
http://192.168.1.104:8080/QQScLauncher.exe
2、写新闻客户端

包含的知识点:HttpURLConnection,ListView,BaseAdapter,inflate,xml的解析,bitmap,runOnUiThread等。

ui效果是公司里面的美工画的

应用的传输数据,定义接口

关于xml的数据,是服务器的开发人员通过一定的技术手段返回的,对应android开发人员我们要会解析就OK,把我们关心的数据取出来,展示到android的空间上

3、smartimageview
(1)首先把com源码包复制到当前工程
(2)然后在布局文件中定义此控件时一定是这个类的完整包名+类名,如
(3)最后可以直接调用图片地址图片:
	iv_icon.setImageUrl(iconUrl);
4、自定义smartimageview

参考网站github

七、三种提交数据到服务器的方式 1、使用HttpURLConnection方式把数据提交到服务器

基于http协议

get方式:组拼url地址把数据组拼到url上,有大小限制 1kb(浏览器规定) 4kb(http协议规定)

post方式:post方式提交安全,没有大小限制。要自己组拼请求正文。请求头信息

get方式提交数据代码如下

	//使用HttpURLConnection   GET方式提交数据
	public static String loginByGet(String username, String password) {
		try {
              //拼装URL 注意为了防止乱码 这里需要将参数进行编码   http://192.168.1.104:8080
			String path = "http://192.168.1.104:8080/Web/LoginServlet?username="
					+ URLEncoder.encode(username,"UTF-8")
					+ "&password="
					+ URLEncoder.encode(password,"UTF-8");
              //创建URL实例
			URL url = new URL(path);
               //获取HttpURLConnection对象
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
              conn.setConnectTimeout(5000);        //设置超时时间
			conn.setRequestMethod("GET");        //设置访问方式
			int code = conn.getResponseCode(); //拿到返回的状态码
			if (code == 200) {                    // 请求成功
				InputStream is = conn.getInputStream();  
				String text = StreamTools.readInputStream(is); 
				return text;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

post方式提交数据代码如下

	//使用HttpURLConnection  POST方式提交数据
	public static String loginByPost(String username, String password) {
		try {
              //要访问的资源路径
			String path = "http://192.168.1.104:8080/Web/LoginServlet";
			//创建URL的实例
               URL url = new URL(path);
               //获取HttpURLConnection对象
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			//设置超时时间
              conn.setConnectTimeout(5000);
              //指定请求方式
			conn.setRequestMethod("POST");
			//准备数据 将参数编码
			String data = "username=" + URLEncoder.encode(username,"UTF-8")
					+ "&password=" + URLEncoder.encode(password,"UTF-8");
              //设置请求头
			conn.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-Length", data.length() + "");
              //将数据写给服务器
			conn.setDoOutput(true);
               //得到输出流
			OutputStream os = conn.getOutputStream();
			os.write(data.getBytes());           //将数据写入输出流中
			int code = conn.getResponseCode(); //那到服务器返回的状态码
			if (code == 200) {
                   //得到服务器返回的输入流
				InputStream is = conn.getInputStream();
                   //将输入流转换成字符串
				String text = StreamTools.readInputStream(is);
				return text;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
2、接口HttpClient

实现get和post提交数据

get

// 采用httpclient get提交数据
	public static String loginByClientGet(String username, String password) {
		try {
			//1 、创建HttpClient对象
			HttpClient client = new DefaultHttpClient();
			//2、拼装路径,注意将参数编码
			String path = "http://192.168.1.104:8080/Web/LoginServlet?username="
					+ URLEncoder.encode(username,"UTF-8")
					+ "&password="
					+ URLEncoder.encode(password,"UTF-8");
			//3、GET方式请求
			HttpGet httpGet = new HttpGet(path);
              //4、拿到服务器返回的HttpResponse对象
			HttpResponse response = client.execute(httpGet);
              //5、拿到状态码
			int code = response.getStatusLine().getStatusCode(); 
			if (code == 200) { 
                   //获取输入流
				InputStream is = response.getEntity().getContent();
                    //将输入流转换成字符串
				String text = StreamTools.readInputStream(is);			
	              return text;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

post

	 //采用httpclient post提交数据
	public static String loginByClientPost(String username, String password) {
		try {
			//1、获取HttpClient对象
			HttpClient client = new DefaultHttpClient();
			//2、指定访问地址
			String path = "http://192.168.1.104:8080/Web/LoginServlet";
              //3、POST方式请求网络
			HttpPost httpPost = new HttpPost(path);
			//4、指定要提交的数据实体
			//准备parameters,列表
			List parameters = new ArrayList();
			//准备NameValuePair,实际上就是我们要提交的用户名,密码;key-values
			BasicNameValuePair nameValuePair = new BasicNameValuePair("username", username);
			BasicNameValuePair pwdValuePair = new BasicNameValuePair("password", password);
			//把nameValuePair和pwdValuePair加入到集合中
			parameters.add(nameValuePair);
			parameters.add(pwdValuePair);
			//准备entity
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters);
			//准备post方式提交的正文,以实体形式准备(键值对形式)
			httpPost.setEntity(entity);
			//5、请求服务器并拿到服务器返回的信息 
			HttpResponse  response =   client.execute(httpPost);
			int code = response.getStatusLine().getStatusCode(); //拿到状态码
			if (code == 200) { //访问成功
				InputStream is = response.getEntity().getContent();
				//将输入流转换成字符串
				String text = StreamTools.readInputStream(is); 
				return text;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
3、使用开源项目AsyncHttpClient
//实现get和post提交数据:参见github网站

总结:3种方式提交数据到服务器

1、HttpURLConnection

Range,使用请求头不能用封装的开源代码使用时就用这个方式

2、HttpClient(了解,没有人用)

3、AsyncHttpClient

使用方便,但是是已经封装好的

八、多线程下载

javase多线程下载AsyncHttpClient

1、多线程下载原理

原创文章 6获赞 6访问量 961 关注 私信 展开阅读全文
作者:名侦探柯小启


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android网络编程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android网络编程

Android网络编程目录小朋友你是不是有很多问号???一、网页源码查看器二、消息机制的写法(重点)1、相关概念2、Handler的使用3、消息机制的原理三、图片查看器四、runOnUiThread的写法五、Handler中的api六、案例
2022-06-06

Android网络编程,调用API获取网络数据

实现步骤: 阅读API接口使用文档使用okhttp 获取网络数据使用 gson将json数据转为数据实体类安装GsonFormatPlus插件使用glide加载网络图片 build.gradle下导入相关依赖 //数据解析
Android网络编程,调用API获取网络数据
2023-12-23

android网络编程之android连接网络的简单示例代码

代码如下:private void callToWebSrvice() { ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context
2022-06-06

网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程
2023-08-30

Android网络编程之获取网络上的Json数据实例

为要获取网络上的Json所以需要服务器端提供的支持。 一、创建服务器端: 服务器端项目结构:服务器端运行效果图:第一步:创建业务所需的JavaBean代码如下: package com.jph.sj.model; import jav
2022-06-06

python网络编程-socket编程

一、服务端和客户端BS架构 (腾讯通软件:server+client)CS架构 (web网站) C/S架构与socket的关系:我们学习socket就是为了完成C/S架构的开发 二、OSI七层模型互联网协议按照功能不同分为osi七层或tcp
2023-01-31

Python网络编程

# notes 要点网络编程客户端/服务器架构客户端/服务器网络编程套接字是计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。进程间通信(Inter Process Co
2023-01-31

网络编程—udp

一、ip地址1. 什么是地址地址就是用来标记地点的 2. ip地址的作用ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在本地局域网上是唯一的。 3. ip地址的分类每一个IP地址包括两部分:网络地址和主机地址 3.1 A类
2023-01-31

网络编程—tcp

一、TCP简介          二、tcp网络程序-客户端          三、tcp网络程序-服务器          四、案例:文件下载器          五、tcp三次握手、四次挥手          六、tcp长连接和短连接 
2023-01-31

【网络编程】网络编程 和 Socket 套接字认识

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🎧一. 网络编程基础🎺1. 为什么需要网络编程?🎷2.
2023-08-23

android 网络编程之网络通信几种方式实例分享

如今,手机应用渗透到各行各业,数量难以计数,其中大多数应用都会使用到网络,与服务器的交互势不可挡,那么android当中访问网络有哪些方式呢? 现在总结了六种方式: (1)针对TCP/IP的Socket、ServerSocket (2)针对
2022-06-06

Android编程简单获取网络上的图片

本文实例讲述了Android编程简单获取网络上的图片的方法。分享给大家供大家参考,具体如下: 要获取网络上的图片,首先得有网络的访问权限,这个不再写了,以前的文章中写过,还有布局方式不再写了,就是写也是一个简单的布局,没有多大意义,直接上核
2022-06-06

pythonnet-网络编程(1)

python的网络编程有不少难点,也容易忘记,最近我会陆续发出系统、完整pythonnet知识的博客,一边复习一边分享,感兴趣的可以关注我。话不多说,开始吧。 网络编程目的:数据的传输ISO(国际标准化组织)OSI七层模型----->网络通
2023-01-30

python网络编程(一)

python网络编程想使用python体验下多简单,于是写了最简单的一个C/S程序,的确实现起来很简单!服务器端程序:#!/usr/bin/pythonimport socketlistensock=socket.socket(socket
2023-01-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录