广告
返回顶部
首页 > 资讯 > 移动开发 >Android网络编程
  • 941
分享到

Android网络编程

Android 2022-06-06 14:06:17 941人浏览 独家记忆
摘要

Android网络编程目录小朋友你是不是有很多问号???一、网页源码查看器二、消息机制的写法(重点)1、相关概念2、Handler的使用3、消息

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 关注 私信 展开阅读全文
作者:名侦探柯小启


--结束END--

本文标题: Android网络编程

本文链接: https://www.lsjlt.com/news/29810.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Android网络编程
    Android网络编程目录小朋友你是不是有很多问号???一、网页源码查看器二、消息机制的写法(重点)1、相关概念2、Handler的使用3、消息...
    99+
    2022-06-06
    Android
  • Android网络编程,调用API获取网络数据
    实现步骤: 阅读API接口使用文档使用okhttp 获取网络数据使用 gson将json数据转为数据实体类安装GsonFormatPlus插件使用glide加载网络图片 build.gradle下导入相关依赖 //数据解析 ...
    99+
    2023-12-23
    android okhttp java Android开发 网络编程 android studio
  • android网络编程之android连接网络的简单示例代码
    代码如下:private void callToWebSrvice() {    ConnectivityManager connManager...
    99+
    2022-06-06
    示例 Android
  • Android网络编程之获取网络上的Json数据实例
    为要获取网络上的Json所以需要服务器端提供的支持。 一、创建服务器端: 服务器端项目结构: 服务器端运行效果图: 第一步:创建业务所需的JavaBean 代码如下: &...
    99+
    2022-06-06
    程之 json数据 JSON Android
  • 网络编程
    1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程...
    99+
    2023-08-30
    网络 Java
  • Java网络编程 - 网络编程介绍 - 网络通信三要素
    文章目录 网络编程网络编程介绍网络通信三要素要素一: IP地址IP地址基本介绍IP地址的操作类 要素二: 端口号要素三: 协议TCP协议UDP协议 网络编程 网络...
    99+
    2023-09-07
    网络 java 网络协议
  • android 网络编程之网络通信几种方式实例分享
    如今,手机应用渗透到各行各业,数量难以计数,其中大多数应用都会使用到网络,与服务器的交互势不可挡,那么android当中访问网络有哪些方式呢? 现在总结了六种方式: (1)针对...
    99+
    2022-06-06
    程之 通信 网络编程 Android
  • python网络编程-socket编程
    一、服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站)   C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发   二、OSI七层模型 互联网协议按照功能不同分为...
    99+
    2023-01-31
    网络编程 python socket
  • Java 网络编程
    Java 网络编程   目录 Java 网络编程   Socket 编程 ServerSocket 类的方法 Socket 类的方法   InetAddress 类的方法 Socket 客户端实例 Socket 服务端实例     网络编...
    99+
    2023-10-09
    java
  • 网络编程—udp
    一、ip地址 1. 什么是地址 地址就是用来标记地点的   2. ip地址的作用 ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在本地局域网上是唯一的。   3. ip地址的分类 每一个IP地址包括两部分:网络地址和主机...
    99+
    2023-01-31
    网络编程 udp
  • 网络编程—tcp
              一、TCP简介           二、tcp网络程序-客户端           三、tcp网络程序-服务器           四、案例:文件下载器           五、tcp三次握手、四次挥手        ...
    99+
    2023-01-31
    网络编程 tcp
  • Python网络编程
    # notes 要点网络编程 客户端/服务器架构 客户端/服务器网络编程 套接字是计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。 进程间通信(Inter Proc...
    99+
    2023-01-31
    网络编程 Python
  • 网络编程(全)
    【网络编程】 今日内容 软件架构CS/BS网络通信三要素TCP通信Socket套接字ServerSocket文件上传自定义服务器 第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client...
    99+
    2023-09-06
    网络 tcp/ip 服务器
  • Python 网络编程
    Python 网络编程 Python 提供了两个级别访问的网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。 高级别的网络服务模块 S...
    99+
    2023-08-31
    网络 服务器 运维
  • 【网络编程】网络编程 和 Socket 套接字认识
    ✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🎧一. 网络编程基础🎺1. 为什么需要网络编程?🎷2....
    99+
    2023-08-23
    网络 服务器 java
  • Android网络编程之UDP通信模型实例
    什么是Android UDP? UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单...
    99+
    2022-06-06
    模型 udp Android
  • Android编程获取网络时间实例分析
    本文实例讲述了Android编程获取网络时间的方法。分享给大家供大家参考,具体如下: 在网上看到的最常见的方式有: public static void main(Strin...
    99+
    2022-06-06
    Android
  • Android编程简单获取网络上的图片
    本文实例讲述了Android编程简单获取网络上的图片的方法。分享给大家供大家参考,具体如下: 要获取网络上的图片,首先得有网络的访问权限,这个不再写了,以前的文章中写过,还有布...
    99+
    2022-06-06
    图片 Android
  • Android网络编程之简易新闻客户端
    一、 通过一个案例“新闻客户端”向大家演示AsyncHttpClient和SmartImageView的综合使用。运行结果如下:1、首先我们了解一下相关知识: SmartImageView的使用市面上一些常见软件,例如手机QQ、天...
    99+
    2023-05-31
    android 新闻客户端 roi
  • C#网络编程之Socket编程
    目录一:什么是SOCKET套接字分类二:SOCKET相关概念1、端口2、协议2.1 TCP:2.2 UDP三:socket一般应用模式:四:SOCKET通信基本流程图:服务器端:客户...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作