Android应用开发技术(下篇共上中下3篇)189_第1页
Android应用开发技术(下篇共上中下3篇)189_第2页
Android应用开发技术(下篇共上中下3篇)189_第3页
Android应用开发技术(下篇共上中下3篇)189_第4页
Android应用开发技术(下篇共上中下3篇)189_第5页
已阅读5页,还剩184页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程第7章学习目标熟悉Http、Https协议的基本概念理解多线程在Android中的实现掌握HttpURLConnection类及方法(★)掌握JSON数据解析(★)掌握Handler消息处理技术(★)掌握Android的网络开发方法(★)2026/2/10第7章Android网络编程2内容大纲Android的多线程Handler消息处理机制网络的基本概念及Http协议Android的网络访问Android的网络框架2026/2/10第7章Android网络编程3上次课回顾多线程的创建方法Handler的消息传递编码实现WebView如何加载网页2026/2/104第7章Android网络编程补充:网络的基本概念及Http协议网络的基本知识IP地址和端口号IP地址:网络中的每台计算机都必须有一个唯一的IP地址作为标识,用一组由"."分隔的十进制数组成端口号:IP地址只能保证将数据送到指定的计算机,但无法知道交给该主机的哪个网络程序,因此采用端口号标识计算机上正在运行的进程每个被发送的网络数据包都包含端口号,用于将该数据帧交给具有相同端口号的应用程序处理Java的网络编程由包中的类进行处理InetAddress类:描述IP地址2026/2/10第7章Android网络编程6网络协议2026/2/10第7章Android网络编程7HTTP协议HTTP(HyperTextTransferProtocol)即超文本传输协议,它规定了浏览器和服务器之间相互通信的规则,是一种请求/响应式的应用层的面向对象的协议,适用于分布式超媒体信息系统主要特点支持C/S模式简单快速:只需传送请求方法和路径,请求方法常用的有:GET、HEAD、POST等灵活:允许传输任意类型的数据对象,用Content-Type进行标记无连接:限制每次连接只处理一个请求无状态:对事务处理没有记忆功能HTTP的URL的格式:http://host[:port][/path]http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用默认端口80;path指定请求资源的URI2026/2/10第7章Android网络编程8HTTP请求报文由请求行、请求报头、空行和请求数据4个部分组成2026/2/109第7章Android网络编程HTTP响应报文由状态行、消息报头、空行、响应正文组成2026/2/1010第7章Android网络编程常见的状态码200OK:客户端请求成功400BadRequest:客户端请求有语法错误,不能被服务器所理解401Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用403Forbidden:服务器收到请求,但是拒绝提供服务404NotFound:服务器无法根据客户端的请求找到资源500InternalServerError:服务器发生不可预期的错误503ServerUnavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常2026/2/1011第7章Android网络编程2026/2/10第7章Android网络编程12https请求HTTPS(HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,也就是HTTP的安全版HTTPS=HTTP+SSL/TLSHTTPS的安全基础是SSLHTTPS的请求过程HTTPS和HTTP的主要区别https协议需要到ca申请证书,一般免费证书较少,需要一定费用http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全2026/2/10第7章Android网络编程13HTTPS的请求过程2026/2/10第7章Android网络编程147.3基于HTTP的网络编程Android的网络编程Http通信HttpURLConnectionAndroid2.3之后,HttpURLConnection是Android网络编程的最佳选择,它的API简单,体积较小,压缩和缓存机制有效较少网络访问的流量HttpClient(自学)Android官方向开发者建议:在Android2.2版本及以下可以使用HttpClient,在2.3以上版本则应该使用HttpURLConnectionAndroid6.0删除了HttpClient类库Socket通信物联网,如:t-io(官网/)2026/2/1016第7章Android网络编程Android9.0的http网络请求问题Android9.0开始要求:默认使用加密连接,禁止App使用任何未加密的连接,因此需要使用TLS(TransportLayerSecurity)传输层安全协议,也就是HttpsAndroid9.0使用HttpUrlConnection进行http的get请求会出现以下异常W/System.err:java.io.IOException:CleartextHTTPtrafficto****notpermitted解决方案:推荐:使用Https连接targetSdkVersion降到27以下版本更改网络安全配置,此更改与网站有关,有时不能得到响应2026/2/1017第7章Android网络编程Android9.0的http网络请求问题更改网络安全配置在res新增xml目录,创建network_security_config.xml,开启http请求在AndroidManifest.xml中的application标签增加以下属性或者在AndroidManifest.xml配置application的属性2026/2/1018<network-security-config>

<base-configcleartextTrafficPermitted="true"/>

</network-security-config>android:networkSecurityConfig="@xml/network_security_config"android:usesCleartextTraffic="true"第7章Android网络编程Android的Https自定义X509TrustManager在使用HttpsURLConnection发起HTTPS请求的时候,提供了一个自定义的X509TrustManager,未实现安全校验逻辑如果不提供自定义X509TrustManager,代码运行起来可能会报异常自定义HostnameVerifier在握手期间,如果URL的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。2026/2/1019第7章Android网络编程URL类统一资源定位符(URL):对可以从互联网上得到的资源的位置和访问的一种简洁表示方式,是互联网上标准资源的地址(百度百科)互联网上的每个资源都有一个唯一的URLURL类提供了多个构造器用于创建URL对象URL类提供多个方法访问URL对应的资源:URLConnectionopenConnection():返回一个URLConnection对象,它表示到URL所引用的远程对象的连接InputStreamopenStream():打开此URL的连接,返回用于读取该URL资源的输入流2026/2/1020第7章Android网络编程AndroidURL通信AndroidHTTPURL接口的基本操作包括:创建URL以及HttpURLConnection对象设置连接参数连接到服务器向服务器写数据从服务器读取数据2026/2/1021第7章Android网络编程AndroidURL通信HttpURLConnection是Java

API的标准接口,包含在J包中,继承自URLConnection类URLConnection与HttpURLConnection都是抽象类,无法直接实例化,通过URL的openConnection方法获得对象2026/2/1022URLurl=newURL("");

HttpURLConnection

connection=(HttpURLConnection)url.openConnection();HttpURLConnection获取输入、输出流的方法getInputStream():获得输入流,调用此方法后才真正发生连接getOutputStream():获得输出流第7章Android网络编程AndroidURL通信HttpURLConnection访问HTTP资源的步骤:根据URL地址创建URL对象使用URL的openConnection()方法获取HttpURLConnection对象设置连接的属性,包括GET/POST请求方式输入、输出数据关闭输入、输出流在AndroidManifest配置文件中设置访问INTERNET的权限案例:D0703_Network2026/2/1023第7章Android网络编程AndroidURL通信HttpURLConnection使用的注意事项使用setConnectTimeout()方法设置连接超时,当网络不好时,Android系统会在超过设置时间后收回资源,中断操作。通过getResponseCode()对响应码进行判断,如果返回响应码为200,则表示连接成功在对大文件操作时,要将文件写到SDCard上,不要直接写到手机内存上操作大文件时,要一边从网络上读取,一边往SDCard上写入,减少手机内存的使用对文件流操作完毕后要及时关闭Android4.0后所有网络通信的操作都不能在主线程进行,需要使用独立的线程完成2026/2/1024第7章Android网络编程补充:常用的免费API接口提供者天行数据:/,注册获取APIKey聚合数据:/,每个接口有appKey易源数据:/,注册申请获取appkey接口大全:/

和风天气:/

MobTech:/。。。。。。

2026/2/1025第7章Android网络编程解析JSONJSON概述JSON:JavaScriptObjectNotation,最初是针对JavaScript而设计,能够很方便地在字符串和JavaScript对象中进行转换。后来成为了一种世界通用的数据交换标准,独立于具体的编程语言。与XML相比,JSON语法简明,格式紧凑,易读易懂,数据传输量小,在移动互联时代,这些特点有着巨大的吸引力,因此,JSON成为了XML的替代者而被广泛应用。/json-zh.html2026/2/1027第7章Android网络编程使用Json对象和数组表示数据{"name"

:

"张三","courses":

["Java程序设计","面向对象软件开发实践","软件工程基础实习"]}2026/2/1028[{"Name":"张三",

"Age":"40"

},{"Name":"李四",

"Age":"20"},{"Name":"王五",

"Age":"35"

},{"Name":"赵六",

"Age":"50"},]第7章Android网络编程JSON的属性值的类型数字:整数或浮点数字符串:双引号""逻辑值:true、false数组:方括号[]对象:花括号{}null2026/2/1029第7章Android网络编程JSON格式的字符串2026/2/10第7章Android网络编程30Android解析JSON2026/2/1031Android内置JSONArrayJSONObject第三方GsonFastJSONJackson将Json文档转换为JSONObject或JSONArray对象将Json文档转换为Java对象第7章Android网络编程JSONObject类方法名功能描述JSONObject()构造一个空的JSONObject对象JSONObject(str)根据JSON字符串的键值对构造一个JSONObject对象JSONArray(str)根据JSON字符串的键值对构造一个JSONArray数组getJSONArray(str)返回str映射的JSONArray数组对象getJSONObject(str)返回str映射的JSONObject对象getXxx(str)返回str映射的值,Xxx类型:boolean、double、int、long、Stringlength()返回此对象中的名称/值映射的数量put(str,value)设置关键字为String类型的值,类型可以为基本类型、对象,返回JSONObject对象optXxx(str)与getXxx()含义相同,如果不存在则返回默认值,不报异常,推荐使用2026/2/10第7章Android网络编程32JSONObjectJSONObject是"Key-Value"的集合Key:String类型Value:基本数据类型包装类(String、Boolean、Integer、Long、Double)、JSONObject、JSONArrayJSONObject可以再嵌套JSONObject或JSONArray,构成一个多级嵌套的结构2026/2/1033JSONObjectjsonObj=newJSONObject(jsonStr);第7章Android网络编程JSONArrayJSONArray代表一个JSON对象的集合,但其中也可以再放置另一个JSONArray,构成一种多层嵌套的结构。2026/2/1034JSONObjectJSONArrayJSONArrayJSONArrayjsonArr=newJSONArray(jsonString);第7章Android网络编程Gson官网:/google/gson导入依赖:implementation'com.google.code.gson:gson:2.8.6'2026/2/1035第7章Android网络编程Gson工作原理2026/2/1036JSON文档/数据Java

ObjectJava

ObjectJava

Objectnew

Gson()fromJson()toJson()Android使用的Java对象第7章Android网络编程GSON类2026/2/10第7章Android网络编程37类型方法名称功能描述创建实例Gson()构造方法创建GsonBuilder().create()使用GsonBuilder对象的create()创建反序列化fromJson(Stringjson,Class<T>clazz)将指定的JSON反序列化为指定类对象fromJson(Stringjson,Typetype)将指定的JSON反序列化为指定泛型对象fromJson(JsonElementjson,Class<T>clazz)将指定的JSON反序列化为指定类对象fromJson(Readerjson,Class<T>clazz)从输入流读取JSON序列化为指定类对象序列化toJson(Objectsrc)将Java对象序列化为JSON字符串toJson(Objectsrc,Typetype)将Java泛型对象序列化为JSON字符串toJson(JsonElementjsonElement)将JsonElement转换为JSON字符串JsonElementgetAsBoolean()元素作为布尔值获取,其它Java类型类似isJsonNull()验证此元素是否为null值JsonObjectaddProperty(Stringproperty,Stringvalue)添加健值对的成员,名称必须是字符串getAsJsonObject(Stringproperty)元素作为JsonObject获取remove(Stringproperty)从JsonObject删除指定属性FastJSON官网:/alibaba/fastjson导入依赖:2026/2/1038implementation'com.alibaba:fastjson:1.2.51'第7章Android网络编程FastJSON的工作原理2026/2/1039JSON文档/数据Java

ObjectJava

ObjectJava

ArrayJSON.parseArray()JSON.toJSONString()Android使用的Java对象JSON.parseObject()第7章Android网络编程Gson默认序列化行为2026/2/1040静态字段不序列化值为null的字段不序列化,反序列化时,"缺"数据的字段设为nullGson默认序列化行为特性第7章Android网络编程Java对象数组的序列化JDK中定义有诸多集合类型,Gson对其支持不好,因此,在开发中,建议只针对数组进行序列化和反序列化FastJSON对集合的解析优于Gson如果需要反序列化为其他集合类型,请使用JSONObject和JSONArray手动完成,或者使用FastJson2026/2/1041第7章Android网络编程第三方数据的获取方式获取第三方数据的学习路径打开聚合数据等数据提供商的网站,注册账号搜索需要的数据API,打开开发文档阅读API文档说明,理解API的应用打开API的示例代码,找到Java或Android的示例代码阅读并理解示例代码,按照要求写入自己的项目中2026/2/1042第7章Android网络编程7.4网络访问框架Android常用的网络编程框架VolleyGoogle官方推出的一套小而巧的异步请求库,支持HttpClient(Android6.0之后不再支持)、HttpURLConnection基于网络队列,适合小数据频繁通信,请求线程池默认大小为4OkHttp高性能http库,支持同步、异步,并支持http2、websocket协议,api简洁易用,实现了http缓存Android网络访问的源码已用OkHttp代替了HttpURLConnectionRetrofit:基于OkHttp封装的一套RESTful网络请求框架,底层默认采用OkHttp目前网络框架的最好选择:RxJava+Retrofit+OkHttp2026/2/1044第7章Android网络编程OkHttp官网:http://square.github.io/okhttp/源码:/square/okhttp

配置OkHttp支持Android2.3及其以上版本,Java要求JDK1.7以上添加依赖:implementation'com.squareup.okhttp3:okhttp:4.9.0'添加权限:<uses-permissionandroid:name="android.permission.INTERNET"/>特点OkHttp是Android版Http客户端,非常高效,支持SPDY、连接池、GZIP和HTTP缓存默认情况下,OkHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题如果应用程序集成了OkHttp,Retrofit默认会使用OkHttp处理其他网络层请求从Android4.4开始,HttpURLConnection的底层实现采用了OkHttp2026/2/1045第7章Android网络编程OkHttp开发思路OkHttp的每次网络请求是一个Request,提供Request必要的参数url、header等,基于Request构造出一个Call对象,再调用它的execute()方法,就能取得WebServer回复的数据如果同步调用,需要在独立的线程中执行,使用异步调用,则采用回调的方式执行,在内部封装了一个请求队列。OkHttp依赖另一个组件okio完成高性能的I/O操作基本用法新建一个OkHttpClient对象通过Request.Builder对象新建一个Request对象通过Request对象构造Call对象,调用enqueue()以异步的方式将call加入调度队列,等待request执行完成通过Call对象的Callback对象返回执行结果2026/2/1046第7章Android网络编程OkHttp请求数据Get异步请求在另外的工作线程执行http请求,请求时不会阻塞当前的线程,所以能在Android主线程中使用异步请求需要加入到一个请求队列中,并且要指定回调方法post异步请求通过RequestBody构建请求数据,然后调用post()方法发送请求post异步请求JSON数据,需要设置MimeType类型案例:D0704_Framework2026/2/10第7章Android网络编程47图片加载框架GlideGlide是由Google开源的一个图片加载库,是快速高效的Android开源媒体管理和图像加载框架它将媒体解码、内存和磁盘缓存以及资源池包装成简单易用的界面。Github:/bumptech/glide中文参考文档:https://muyangmin.github.io/glide-docs-cn/2026/2/1048第7章Android网络编程图片加载框架Glide添加依赖添加网络权限使用2026/2/1049implementation'com.github.bumptech.glide:glide:4.11.0'

annotationProcessor'com.github.bumptech.glide:compiler:4.11.0'

//https图片处理

implementation"com.github.bumptech.glide:okhttp3-integration:4.11.0"Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);<uses-permissionandroid:name="android.permission.INTERNET"/>第7章Android网络编程图片加载框架Glide加载图片的一般方法常用方法:/p/2edd1767d66b2026/2/1050Glide.with(Contextcontext).load(Strinturl).into(ImageViewimageView);

第7章Android网络编程Glide集成OkHttp加载https图片导入依赖:创建支持https的OkHttpClient对象创建继承AppGlideModule的类,重写registerComponents()方法使用时,用GlideApp替代Glide类2026/2/10第7章Android网络编程51implementation'com.github.bumptech.glide:okhttp3-integration:4.10.0'Volley框架官网:/google/volley在app的build.gradle导入依赖implementation'com.android.volley:volley:1.1.1'Volley的开发流程创建一个RequestQueue对象创建一个Request对象将Request对象添加到RequestQueue里面2026/2/1052第7章Android网络编程RetrofitAtype-safeRESTclientforAndroidandJava针对Android和Java应用开发的一个类型安全的REST客户端程序网络库官网:http://square.github.io/retrofit/源码:/square/retrofitAndroidStudio的配置添加依赖:implementation'com.squareup.retrofit2:retrofit:2.4.0'由于Retrofit依赖OkHttp,还需加入OkHttp的依赖设置权限:<uses-permissionandroid:name="android.permission.INTERNET"/>2026/2/1053第7章Android网络编程Rtrofit工作原理Retrofit使用一个Java接口来访问一个特定的RESTAPI,在定义接口时,通过各种注解(annotation)来定义HTTP请求的各种参数与特性,集成了URL参数替换和查询字符串生成的功能,并能支持文件上传和基于HTML表单的数据发送。Retrofit底层依赖OkHttp实现,Retrofit本质上是对OkHttp的更进一步封装。编程套路Retrofit将HTTPAPI转化成了Java接口的形式Retrofit类可以针对之前定义的接口生成一个具体实现然后就可以调用生成的对象所提供的方法进行网络的同步或异步访问2026/2/10第7章Android网络编程54总结Http协议的基本概念HttpClientConnection网络编程结合Handler进行网络编程及数据处理使用FastJson、Gson或JackJson解析json数据OkHttp框架使用第三方数据的流程2026/2/1055第7章Android网络编程作业✎思考题简述三种实现多线程方法的区别。简述使用HttpURLConnection访问网络的步骤。简述Handler消息传递机制的原理。简述OkHttp网络框架的基本原理。✎编程题使用两种多线程的实现方法,完成2个窗口同时卖火车票;每个窗口卖100张,卖票速度都是1张/s的功能。使用OkHttp框架重构【案例7-3】的天气预报。2026/2/1056第7章Android网络编程提问时间2026/2/10第7章Android网络编程57待续…多媒体技术58网络编程第7章学习目标熟悉Http、Https协议的基本概念理解多线程在Android中的实现掌握HttpURLConnection类及方法(★)掌握JSON数据解析(★)掌握Handler消息处理技术(★)掌握Android的网络开发方法(★)2026/2/10第7章Android网络编程60内容大纲Android的多线程Handler消息处理机制网络的基本概念及Http协议Android的网络访问Android的网络框架2026/2/10第7章Android网络编程61上次课回顾服务的生命周期及应用场景服务的启动与绑定的区别服务与Activity之间的数据交互广播的基本概念广播的分类及区别发送与接收广播2026/2/1062第7章Android网络编程7.1Android的多线程多线程的概念Android的多线程本质上是Java的多线程实现多线程的方式继承Thread类实现Runnable接口实现FutureTask接口和Callable接口回调实现有返回值的线程案例:D0701_MultiThread2026/2/10第7章Android网络编程64线程的状态转换2026/2/10第7章Android网络编程65Android的多线程Android的线程分为主线程和子线程主线程:也称为UI线程,运行四大组件以及处理与用户的交互子线程:执行耗时任务,比如:网络请求、I/O操作等Android规定:如果在主线程中执行耗时操作,会导致程序无法及时响应,即:ANR,ApplicationNotRespondingAndroid的UI控件是线程不安全的,多线程的并发访问会导致UI控件的状态不可预期Android禁止子线程更新UI控件,所有界面更新都必须在UI线程进行2026/2/10第7章Android网络编程66主线程与子线程的交互Handler:与Thread结合,最常用的交互方式IntentService:特殊的Service,用于处理通过Intent传递的异步请求AsyncTask:Android11被弃用ThreadPoolExecutor:替代AsyncTaskAndroid切换到主线程更新UI的简化方法view.post(Runnable)view.postDelayed(Runnable,Object,long)view.postAtTime(Runnable,long)activity.runOnUiThread(Runnable)2026/2/10第7章Android网络编程67Handler背景:Android开发规定只允许UI线程更新Activity中的UI组件在实际开发中,存在多个线程并发操作UI组件的情况,导致UI操作的线程不安全解决方案:Handler的消息传递机制工作线程需要更新UI时,通过Handler通知主线程,从而在主线程更新UI操作,实现异步消息的处理2026/2/10第7章Android网络编程68Handler提供Android的消息传递机制作用:在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异步消息的处理。工作流程:异步通信准备:在主线程中创建Handler对象消息发送:通过Handler发送消息消息循环:消息分发消息处理:Handler根据消息进行UI操作2026/2/10第7章Android网络编程69Handler的执行流程2026/2/10第7章Android网络编程70Handler涉及的概念概念定义作用备注主线程(UI线程)当应用程序第1次启动时,会同时自动开启1条主线程处理与UI相关的事件,如更新、操作等主线程与子线程的通信媒介=Handler子线程(工作线程)人为手动开启的线程执行耗时操作,如网络请求、数据加载等消息(Message)线程间通讯的数据单元,即Handler接受和处理的消息对象存储需操作的通信信息消息队列(MessageQueue)一种先进先出的数据结构存储Handler发送过来的消息Message处理者(Handler)主线程与子线程的通信媒介线程消息的主要处理者添加消息到消息队列循环器分派过来的消息循环器(Looper)消息队列与处理者的通信媒介消息循环,即:消息获取:循环取出消息队列的消息消息分发:将取出的消息发送给对应的处理者每个线程中只能有1个Looper1个Looper可绑定多个线程的Handler2026/2/10第7章Android网络编程71Handler涉及的对象Message类:表示要传递的一个消息MessageQueue类:存放消息对象的消息队列,先进先出原则Looper类:负责管理当前新城的消息对象MessageQueueHandler类:负责把消息push到消息队列,并接收Looper从消息队列中取出的消息Android启动后会在UI线程创建一个MessageQueue队列2026/2/10第7章Android网络编程72Message对象获取消息对象Message.obtain():静态方法,从消息池获取一个Message对象,如果消息池是空的,则实例化一个新的Message对象,消息的上限是10个,这样使得消息资源能重复利用handler.obtainMessage():实例方法,具有多个重载方法,其内部实现也是调用Message.obtain()设置、获取数据复杂数据:setData(bundle)、getData()简单数据:msg.obj传递一个任意的对象、msg.arg1和msg.arg2分别传递一个int值msg.what:定义的消息码,用于设定消息的标志2026/2/1073第7章Android网络编程Handler编程新建Handler子类的方式创建Handler子类继承于Handler类,重写handleMessage()方法在Activity中创建Handler对象实例在工作线程中创建所需的Message消息对象在工作线程中通过Handler对象发送消息到消息队列中,方法有:sendMessage()、sendMessageDelayed()、sendEmptyMessage()、sendEmptyMessageDelayed()、sendMessageAtTime()开启工作线程案例:D0701_MultiThread2026/2/10第7章Android网络编程74Handler发送消息的方法voidhandleMessage(Messagemsg):处理消息的方法,通常是用于被重写发送消息

sendEmptyMessage(intwhat):发送空消息sendEmptyMessageDelayed(intwhat,longdelayMillis):指定延时多少毫秒后发送空信息sendMessage(Messagemsg):立即发送信息sendMessageDelayed(Messagemsg,longdelayMillis):指定延时多少毫秒后发送信息hasMessage(intwhat):检查消息队列中是否包含what属性为指定值的消息post(Runnabler)postAtTime(Runnabler,longuptimeMillis)postDelayed(Runnabler,longdelayMillis)注意:如果是参数为(intwhat,Objectobject):除了判断what属性,还需要判断Object属性是否为指定对象的消息2026/2/10第7章Android网络编程75ThreadPoolExecutor线程池技术2026/2/10第7章Android网络编程76ThreadPoolExecutor使用ThreadPoolExecutor的基本步骤包括:创建任务类,重写run()方法使用Executors的工厂方法创建线程池向线程池提交任务关闭线程池案例:D0701_MultiThread2026/2/10第7章Android网络编程777.2WebView782026/2/10第7章Android网络编程WebView控件WebView控件:加载HTML5页面使用WebView控件布局中使用<WebView>调用WebView的loadUrl()加载页面调用WebView的setWebViewClient()方法,通过重写WebViewClient对象的showOverrideUrlLoading()方法实现在当前界面加载网页,而不是跳转到浏览器打开2026/2/10第7章Android网络编程79加载网页或数据loadUrl(Stringurl):加载网页loadData(Stringdata,StringmimeType,Stringencoding):加载html片段操作网页canGoBack():是否可以后退goBack()/goForward():回退/前进goBackOrFOrward():前进或回退指定的位置案例:D0702_WebView第7章Android网络编程80WebView类的方法AsyncTask–自学Android已封装好的轻量级异步类(Android11被弃用)作用实现多线程,在工作线程中执行耗时任务实现工作线程与主线程(UI线程)之间的通信,保证线程安全优点简单、方便,无需使用"任务线程+Handler"的复杂组合节省资源,采用线程池的缓存线程+复用线程2026/2/10第7章Android网络编程81AsyncTask工作流程2026/2/10第7章Android网络编程82小结多线程的基本概念创建多线程的方法Handler消息传递ThreadPoolExecutor线程池2026/2/1083第7章Android网络编程提问时间2026/2/10第7章Android网络编程84待续…网络编程85多媒体开发第8章学习目标了解多媒体的基本概念掌握Android音视频的播放方法(★)掌握Android三种动画的使用方法(★)理解各种动画的应用场景2026/2/10第8章多媒体开发87内容大纲多媒体的基本概念音、视频播放动画和过渡2026/2/10第8章多媒体开发88上次课回顾HttpURLConnection网络请求的过程Gson如何解析JSON字符串什么是OkHttp框架2026/2/1089第8章多媒体开发8.1多媒体简介

902026/2/10第8章多媒体开发多媒体的概念多媒体:Multimedia,文本、声音、图片、动画、视频……计算机系统的定义两种或两种以上资源组合的一种人机交互式信息交流和传播媒体涉及了硬件抽象层、编解码、底层多媒体框架、Android多媒体框架和应用层接口等Android多媒体应用的开发,包括:音频Audio和视频Video的播放、动画过渡支持的图片格式:JPEG、GIF、PNG和BMP。支持的音频格式:3GP、MP3和WAV支持的视频格式:3GP、MP42026/2/10第8章多媒体开发91Android多媒体接口MediaPlayer类:播放声音、视频的API,提供获取、解码和播放等功能AudioManager类:管理设备上的音频源和音频输出MediaRecorder:提供音频、视频录制等AudioRecord:提供音频的录音接口,默认编码为PCM_16_BITSoundPool:提供几种声音同时播放的功能,适用于游戏场景Ringtone:提供系统自带的声音文件的播放功能,适用于系统提示音VideoView:播放视频Camera:拍照和录像2026/2/10第8章多媒体开发928.2音频播放MediaPlayer类MeadiaPlayer类提供获取、解码以及播放音频和视频的API支持多种不同的媒体源,如:本地资源、内部URI资源、外部或网络资源2026/2/10第8章多媒体开发94使用MediaPlayer实现步骤实例化MediaPlayer类,加载或设置数据源准备播放播放或暂停播放停止播放释放资源案例:D0801_MusicPlayer2026/2/10第8章多媒体开发95加载音频文件的方法类方法creat(Context,Uri):从URI来装载音频文件,返回MediaPlayer对象creat(Context,resid):从res资源获取id对应的资源文件中装载音频文件,返回MediaPlayer对象实例方法setDataSource(String):从本地、SD卡或网络加载数据文件来源raw资源:R.raw.test本地文件:setDataSource("sdcard/test.mp3")网络URL文件:setDataSource("/music/test.mp3")2026/2/10第8章多媒体开发96音频播放相关的方法start():开始或者恢复播放pause():暂停播放reset():重置为初始状态seekTo():拖曳进度stop():停止播放release():释放资源2026/2/10第8章多媒体开发97MediaPlayer的方法事件监听器setOnCompletionListener():播放完成的事件监听setOnErrorListener():播放错误的事件监听setOnPreparedListener():prepare方法的事件监听setOnSeekCompleteListener():seek方法的事件监听其它方法isPlaying():是否在播放getDuration():获取音频时长,单位:毫秒getCurrentPosition():获取当前的播放进度2026/2/10第8章多媒体开发98MediaPlayer的状态转换2026/2/10第8章多媒体开发99MediaPlayer的状态转换状态转换的注意点Started->Paused->Stopped的转换是单向的Initialized状态需要装载数据,才可以调用start()播放End、Error状态游离在其他状态之外,在任何状态皆可切换2026/2/10第8章多媒体开发1008.3视频播放播放视频MediaPlayer既可以播放音频,也能播放视频,但无法提供视频图像的输出视频输出的控件VideoView:最简单的视频播放方式,支持:mp4、avi、3gb等格式的视频SurfaceView:提供一个独立的绘图Surface嵌入到视图结构层次中,用于输出视频图像2026/2/10第8章多媒体开发102使用VideoView播放视频Android通过VideoView组件进行视频的播放,步骤如下:在界面布局中定义VideoView组件,或通过java代码定义调用VideoView的方法加载视频setVideoPath(Stringpath):加载视频文件setVideoURI(Uriuri):加载uri所对应的视频调用VideoView的start()、pause()、stop()等方法控制视频的播放案例:D0802_VideoPlayer2026/2/10第8章多媒体开发103使用SurfaceViewSurfaceView继承自View,但与普通View有较大区别SurfaceView提供的独立的绘图Surface可以在独立的线程中渲染,而不占用主线程资源SurfaceView的双缓冲技术也能有效解决反复局部刷新带来的闪烁问题,后台缓冲区接受数据,当绘制完整后提交到前台缓冲区显示,提高渲染效率和刷新速度应用场景:广泛用于游戏开发中,如绘制游戏背景、动画等复杂UI界面2026/2/10第8章多媒体开发104SurfaceView的工作原理2026/2/10第8章多媒体开发105使用SurfaceView开发流程在布局中使用SurfaceView控件使用SurfaceView的getHolder()方法获得SurfaceHolder对象通过SurfaceHolder对象设置图像的分辨率和Callback接口重写Callback接口的surfaceCreated、surfaceChanged和surfaceDestroyed这三个方法SurfaceView提供了两个线程:UI线程和渲染线程,在使用过程中需要注意以下两点:SurfaceView和SurfaceHolder.Callback的方法都应在UI主线程调用;要确保渲染线程访问的是合法有效的Surface案例:D0802_VideoPlayer2026/2/10第8章多媒体开发1068.4动画和过渡2026/2/10第8章多媒体开发107动画分类视图动画:作用于View控件逐帧动画FrameAnimation:顺序播放一系列图片产生动画效果补间动画TweenAnimation:通过对场景中的View不断做渐变、旋转、缩放或平移等变换产生动画效果属性动画:作用于任意Java对象补间动画的增强版,通过动态改变对象的属性达到动画效果2026/2/10第8章多媒体开发108实现动画的方法XML方式/res/anim设置动画:alpha、scale、translate、rotate调用AnimationUtils.loadAnimation()加载xml动画,调用startAnimation()方法启动动画编码方式动态创建动画对象,设置动画参数,然后调用startAnimation()启动动画,透明度动画类为AlphaAnimation、缩放动画类为ScaleAnimation、位移动画类为TranslateAnimation、旋转动画类为RotateAnimation2026/2/10第8章多媒体开发109逐帧动画原理将动画拆分为帧的形式,且定义每一帧=每一张图片逐帧动画的本质:按序播放一组预先定义好的图片应用场景较为复杂的个性化动画效果与补间动画类似,也是作用于UI控件特点使用简单、方便容易引起OutOfMemory,避免使用尺寸较大的图片2026/2/10第8章多媒体开发110使用逐帧动画步骤将动画资源(即每张图片资源)放到drawable文件夹里在布局中设置动画或通过编码启动动画案例:D0803_Animation2026/2/10第8章多媒体开发111插值器和估值器插值器Interpolator接口设置属性值从初始值过渡到结束值的变化规律用于实现非线性运动的动画效果在动画设置xml中使用android:interpolator估值器TypeEvaluator接口设置属性值从初始值过渡到结束值的变化的具体数值协助插值器实现非线性运动的动画效果使用ObjectAnimator.ofObject()方法设置2026/2/10第8章多媒体开发112补间动画原理通过确定开始和结束的视图样式,中间动画变化由系统补全来确定一个动画如:平移、缩放、旋转和透明度类型平移动画Translate:移动视图的位置,TranslateAnimation类缩放动画Scale:放大/缩小视图的大小,ScaleAnimation类旋转动画Rotate:旋转视图的角度,RotateAnimation类透明度动画Alpha:改变视图的透明度,AlphaAnimation类2026/2/10第8章多媒体开发113补间动画应用场景视图中,标准、基础的动画效果Activity、Fragment的切换效果视图组ViewGroup中子元素的出场效果特点使用简单、方便仅控制整体实体效果,无法控制属性2026/2/10第8章多媒体开发114使用补间动画步骤在res/anim目录创建动画效果xml文件根据不同动画效果的语法,设置不同的动画参数在java类中创建Animation对象,播放动画;或者在java类中创建动画对象并播放案例:D0803_Animation2026/2/10第8章多媒体开发115xml元素与Java类的关系XML元素Java类功能描述<translate>TranslateAnimation位移动画<scale>ScaleAnimation缩放动画<rotate>RotateAnimation旋转动画<alpha>AlphaAnimation渐变透明度动画<set>AnimationSet多种动画的组合2026/2/10第8章多媒体开发116补间动画的公共属性duration:动画持续时间(ms),必须设置,动画才有效果startOffset:动画之间的时间间隔(ms)fillBefore:设置为true,动画转化开始前被应用,默认为truefillAfter:设置为true,动画转化在动画结束后被应用,默认为falsefillEnabled:是否应用fillBefore值,对fillAfter值无影响,默认为truerepeatMode:选择重复播放动画模式,restart正序重放,reverse倒序回放,默认为restartrepeatCount:重放次数(动画的播放次数=重放次数+1),infinite无限重复interpolator:插值器,即影响动画的播放速度2026/2/10第8章多媒体开发117位移动画常用属性android:fromXDelta="0"

视图在水平方向x移动的起始值android:fromYDelta="0%p"

视图在水平方向y移动的起始值android:toXDelta="500"

视图在水平方向x移动的结束值android:toYDelta="-100%p"

视图在水平方向y移动的结束值数字:单位为像素百分比:相对于控件宽度或高度的百分比百分比+p:相对于控件的父控件的百分比正负号:负值上移,正值下移2026/2/10第8章多媒体开发118缩放动画相应的属性android:fromXScale="0.0":动画在X方向的起始缩放倍数android:toXScale="2":动画在X方向的结束缩放倍数android:fromYScale="0.0":动画在Y方向的起始缩放倍数android:toYScale="2":动画在Y方向的结束缩放倍数android:pivotX="50":缩放缩放中心点的x坐标,可取值为数字,百分比,或者百分比+pandroid:pivotY="50":缩放缩放中心点的y坐标pivotX、pivotY的取值数字:轴点为View的左上角的原点在x方向和y方向加上50px的点百分比:轴点为View的左上角的原点在x方向加上自身宽度50%和y方向自身高度50%的点百分比p:轴点为View的左上角的原点在x方向加上父控件宽度50%和y方向父控件高度50%的点轴点:视图缩放的中心点2026/2/10第8章多媒体开发119旋转动画相应的属性android:fromDegrees="0":动画开始时,视图的旋转角度(正数:顺时针,负数:逆时针)android:toDegrees="270":动画结束时,视图的旋转角度android:pivotX="50%":旋转轴点的x坐标(轴点:视图缩放的中心点)android:pivotY="0":

旋转轴点的y坐标2026/2/10第8章多媒体开发120透明度动画相应属性android:fromAlpha="1.0":动画开始时视图的透明度(取值范围-1~1)android:toAlpha="0.0":动画结束时视图的透明度(取值范围-1~1)2026/2/10第8章多媒体开发121动画的事件监听loadAnimation.setAnimationListener(newAnimation.AnimationListener(){

@Override

publicvoidonAnimationStart(Animationanimation){

}

@Override

publicvoidonAnimationEnd(Animationanimation){

}

@Override

publicvoidonAnimationRepeat(Animationanimation){

}

});2026/2/10第8章多媒体开发122属性动画属性动画(PropertyAnimation)是在Android3.0后提供的一种全新动画模式,针对视图动画的局限性和动画效果单一等缺点原理在一定时间间隔内,通过不断对值进行改变,不断将该值赋给对象的属性,实现动画效果可以是任意对象的任意属性特点作用对象进行了扩展,不只是View对象动画效果丰富,不只是4种基本变换,还有其它的动画效果应用场景:与属性相关、更加复杂的动画效果2026/2/10第8章多媒体开发123属性动画2026/2/10第8章多媒体开发124使用类作用备注ValueAnimator先改变值,然后手动赋值给对象的属性(间接赋值)本质是值的操作机制ObjectAnimator先改变值,然后自动赋值给对象的属性(直接赋值)采用get()&set()进行自动赋值AnimatorSet实现组合动画ViewPropertyAnimator采用对对象操作addListener()动画监听器,监听动画开始/结束/取消/重复时刻可采用动画适配器(AnimatorListenerAdapter)按需监听动画时刻属性动画的自定义属性时长(Duration):指定动画总共完成所需要的时间,默认为300毫秒时间插值器(TimeInterpolator):基于当前动画已消耗时间的函数,用于计算属性值重复计数(RepeatCount):指定动画是否重复执行以及执行次数,也可以指定动画向反方向回退操作动画集(AnimatorSet):定义一组动画,设置同时执行或者顺序执行延迟刷新时间(Framerefreshdelay):指定动画的刷新频率,默认为每10ms刷新一帧,但真实的刷新频率取决于整个系统的运行状态2026/2/10第8章多媒体开发125属性动画的运行机制通过不断改变View的属性值实现的,具体步骤包括:通过get()方法获取目标对象的属性值;调用时间插值器方法修改属性值;调用set()方法更改目标对象的属性值,达到动画效果。2026/2/10第8章多媒体开发126ValueAnimator类属性动画机制最核心的类通过不断控制值的变化,再不断手动赋给对象的属性,从而实现动画效果ValueAnimator类的方法ValueAnimator.ofInt(int…values):将初始值以整型数值的形式过渡到结束值ValueAnimator.ofFloat(floatvalues):将初始值以浮点型数值的形式过渡到结束值ValueAnimator.ofObject(intvalues):将初始值以对象的形式过渡到结束值2026/2/10第8章多媒体开发127使用属性动画编码实现属性动画的步骤设置ValueAnimator对象的初始值和结束值设置动画播放的各种属性通过动画更新监听器AnimatorUpdateListener将属性值手动赋值给对象的属性将改变的值赋给对象的属性属性对象视图启动动画案例:D0803_Animation2026/2/10第8章多媒体开发128使用属性动画xml实现属性动画的步骤在/res/animator文件夹创建xml设置动画属性在java类中启动动画案例:D0803_Animation2026/2/10第8章多媒体开发129内置插值器插值器类名称含义描述AccelerateDecelerateInterpolator变化率开始和结束时缓慢,中间阶段加快AccelerateInterpolator变化率加速度变化AnticipateInterpolator先反向变化,然后再急速正向变化AnticipateOvershootInterpolator插先反向变化,再急速正向变化,然后超过设定值,最后返回到最终值BounceInterpolator变化率在结束时回弹CycleInterpolator在指定数量的周期内循环DecelerateInterpolator变化率减速变化,与AccelerateInterpolator相反LinearInterpolator变化率恒定不变,匀速变化OvershootInterpolator急速正向变化,超出最终值后返回TimeInterpolator插值器的父接口,用于实现自定义的插值器2026/2/10第8章多媒体开发130ObjectAnimatorObjectAnimator是ValueAnimator的子类,可以直接对对象的属性进行动画操作,简化为对象添加动画的过程与ValueAnimator的区别ValueAnimator类是先改变值,然后手动赋值给对象的属性实现动画,间接对对象属性进行操作ObjectAnimator类是先改变值,然后自动赋值给对象的属性实现动画,直接对对象属性进行操作2026/2/10第8章多媒体开发1312026/2/10第8章多媒体开发132ObjectAnimator相关属性属性名称对应的set方法含义描述alphasetAlpha(float)控制View的透明度translationXsetTranslationX(float)控制X方向的位移translationYsetTranslationY(float)控制Y方向的位移scaleXsetScaleX(float)控制X方向的缩放比例scaleYsetScaleY(float)控制Y方向的缩放比例rotationXsetRotationX(float)控制以X为轴的旋转度数rotationYsetRot

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论