Android-Studio移动应用开发任务教程(微课版)教案(6).docx

上传人:太** 文档编号:60565220 上传时间:2022-11-16 格式:DOCX 页数:40 大小:558.43KB
返回 下载 相关 举报
Android-Studio移动应用开发任务教程(微课版)教案(6).docx_第1页
第1页 / 共40页
Android-Studio移动应用开发任务教程(微课版)教案(6).docx_第2页
第2页 / 共40页
点击查看更多>>
资源描述

《Android-Studio移动应用开发任务教程(微课版)教案(6).docx》由会员分享,可在线阅读,更多相关《Android-Studio移动应用开发任务教程(微课版)教案(6).docx(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、教学单元:移动应用开发(13)授课班级:授课时间:4教学地点:教学目的:应知:1、了解Android网络访问基本概念;2、了解数据传输方式;应会:1、 能够配置服务端;能够使用异步任务完成网络通信;2、 能完成简单Android程序的开发。教学重点、难点:1. 服务端配置2. 异步任务教学方法:根据本堂课教学内容的重点与难点,教学过程中主要采用以下教学方法:1. 在理论教学上,主要在钉钉平台上进行,以讲授和教学演示为主,通过提 问引导学生发现问题、分析问题,掌握Android软件开发的基本概念和流 程。2. 在实践教学上,采用“实例引导,工程驱动”的方式讲授。通过实现相关 实例,在实例基础上改

2、造拓宽,真正实现“学以致用二钉钉和QQ相结 合,采用演示、实践和讨论相结合的模式。3. 注重教学整体过程设计,依托网络平台,将课前预习、课中讲授与演练和课后练习与讨论答疑有机结合,不断摸索提高教学效果。备注:教学过程设计:Message msg=new Message();msg.obj=str;handler. sendMessage(msg);(21)点击运行,成功显示信息。总结一下使用多线程结合Handler实 现获取服务端信息的过程及注意的问题。可以看出,这种做法相比照拟 复杂,那么有没有简单的方式呢?一一异步任务(22)介绍异步任务的相关知识,展示需要完成的工程。(23)首先测试服务

3、端的响应是否正确,注意,此处标黄的地方为当前 电脑的IP地址。 :10. 1. 102. 44/SoccerDataHandler. ashx?action=getTeamStr0(24)在工程 Test 中,新建一个 Activity,命名为 TeamActivity, 并将其设置为启动的Activity。翻开activity_team. xml,切换到Design 视图,将ListView拖入界面,设置相应约束,同时,设置TextView的 id为tvNoData, Text属性值为“没有数据”。Component Tree* |*-N ConstraintLayoutAb tvNoDat

4、a (TextView);殳与教据 =IvCountry (ListView)(25 )设置当ListView没有数据时,显示的信息, IvCountry. setEmptyView(tvNodata)用来设置当 ListView 中没有数据 时显示的内容。(26)访问服务端,将获取的国家名称字符串用ListView来显示。这 里,我们使用异步任务来实现该功能。首先,新建类StrGetTask,继承 自AsyncTask,并指定相关泛型,重写相关方法(这里我们重写两个方 法)。public class StrGetTask extends AsyncTask Overrideprotected

5、 String doInBackground (String. . params) return null;Overrideprotected void onPostExecute(String s) super.onPostExecute(s);(27)在 doInBackground(String. params)方法中,访问服务端,并获取返回数据。protected String doInBackground (String. . . params) try URLConnection con= ( URLConnection) newURL(params0). openConnecti

6、on();int code=con. getResponseCode ();if (code= URLConnection. _0K) InputStream is=con. getInputStream();ByteArrayOutputStream baos=new ByteArrayOutputStream();int n=0;byte buf=new byte1024;while(n=is. read(buf) !=T) baos. write (buf, 0, n);String str= baos. toString(,UTF-8,/);Log. i (Test”, str);re

7、turn str;) catch (lOException e) e. printStackTrace(); return null;(28 )在onPostExecute(String s)方法中,将获得的数据显示在ListView中。由于StrGetTask类是一个外部类,不能访问MainActivity类中的IvCountry,因此,我们需要将数据集合和相关的adapter对象传 入 StrGetTask 中,使用 adapter 的 notifyDataSetChanged ()方法刷新 ListView中的数据。修改StrGetTask类的代码,添加两个成员变量,定 义带参数的构造器

8、方法初始化这两个成员变量。public class StrGetTask extends AsyncTask private List list;private ArrayAdapter adapter;public StrGetTask(List list, ArrayAdapter adapter) this, list = list;this, adapter = adapter;/o o o以下代码不变,故省略 (29)修改 onPostExecute (String s)方法中的代码,刷新 ListView 中 的数据。protected void onPostExecute (St

9、ring s) if (s!=null) List strList= Arrays. asList( s.split (,);list, clear();list. addAll(strList);adapter. notifyDataSetChanged (); )(30)切换回TeamActivity. java中,修改相关代码,调用异步任务, 实现网络访问。public class MainActivity extends AppCompatActivity private TextView tvNodata;private ListView IvCountry;private List

10、 list;private ArrayAdapter adapter;Overrideprotected void onCreate (Bundle savedlnstanceState) super. onCreate(savedlnstanceState);setContentView(R. layout, activity main);tvNodata= (TextView) findViewById(R. id. tvNoData);lvCountry= (ListView) findViewById(R. id. IvCountry);IvCountry. setEmptyView(

11、tvNodata);list=new ArrayList ();adapter=new ArrayAdapter (this,R. layout, support_simp1e_spinner_dropdown_item, list);IvCountry. setAdapter(adapter);new StrGetTask(list, adapter). execute(1. 102. 44/SoccerDataHand1er. ashx?action=getTeamStr);(31)点击运行,验证程序能否正确运行,了解学生进度。作业:教学单元:移动应用开发(14)授课班级:授课时间:2教学

12、地点:教学目的:应知:1、了解JSON的基本概念;2、了解JSON数据的解析;应会:4、 能够使用Gson解析JSON数据;能够处理复杂结构的网络数据;5、 能使用异步任务实现Android网络通信程序。教学重点、难点:3. Gson解析JSON数据4. 异步任务实现较为复杂的网络通信程序教学方法:根据本堂课教学内容的重点与难点,教学过程中主要采用以下教学方法:4. 在理论教学上,主要在钉钉平台上进行,以讲授和教学演示为主,通过提问引导学生发现问题、分析问题,掌握Android软件开发的基本概念和流 程。5. 在实践教学上,采用“实例引导,工程驱动”的方式讲授。通过实现相关 实例,在实例基础上

13、改造拓宽,真正实现“学以致用”。钉钉和QQ相结 合,采用演示、实践和讨论相结合的模式。6. 注重教学整体过程设计,依托网络平台,将课前预习、课中讲授与演练和 课后练习与讨论答疑有机结合,不断摸索提高教学效果。备注:教学过程设计:1 .课程设计(1)回顾上一节课的内容,提出本次课程的目标一一如何 处理复杂结构的网络数据。这主要牵涉如何表述数据、如何 获取数据以及如何解析数据几个问题。(2)首先我们来看看如何表述一个复杂结构的数据。在程 序中,我们通常是用类来描述数据的,比方,我们描述一张 数据表中的数据,首先会根据表的定义,设计一个实体类, 然后用集合来描述一组这样的数据,在程序中传递数据,我

14、们可以方便的使用数据对象来实现,但是如果我们需要将这 些数据通过网络传输,那么不适合使用对象的形式,而需要将 其转换为一个字符串数据,那么如何描述这样一组数据呢? 目前主要有XML和JSON两种形式,这里我们采用JSON方 式。简单介绍JSON的相关知识。(3)采用JSON格式来传输数据,那就需要做两方面的工 作,第一是将数据对象转换为JSON格式的字符串(序列化), 第二是将JSON格式的字符串转换为数据对象,方便程序使 用(反序列化)。那么如何解析JSON格式的数据呢? Google 为我们提供的Gson,能够方便实现。(4)下面,我们用一个简单的例子来演示一下如何使用 Gson实现对JS

15、ON数据的序列化和反序列化。(5)新建工程“Ex06_GsonTest”,设计界面如下。Component Tree奇 V N ConstraintLayout* btnSrializ (Button)* btnDs*rkiliz (Button)At tvinform (TextView) 7:00Ex06_GsonTest序列化反序列化显示序列化时象的信息OD(6)定义实体类Student。public class Student private String StuNum;private String StuName;private int StuAge; o o o o o )(7)为

16、了使用Gson,我们首先需要将Gson引入到工程中,翻开build, gradle文件,找到“dependencies”节,输入相关代码,然后,单击图6-12中右上角的Sync Now”链接,Android Studio会自动实现 对Gson的引用。喻 Android。丰 立,9 activity mainj(ml x c Studentjava x c Ma in Activity .java xEx06 GsonTest x (Japp xEpp亡manifests D javaGradle files have changed since last project sync. A pro

17、ject sync may be necessary for the IDE to work properly. |Sync Now|apply plugin:com. android, application21 由 cn.edu.szpt.ex06_gsontest (test.r Qres由 drawable25由 layout2697 S3 mipmap28 Ej values? Gradle Scripts build.gradle (Project: Ex06_GsonTes30build.gradle lod .!e: a:.:)31二 cn.edu.szpt.ex06_gson

18、test a ndroic -est;E cn.edu.szpt.ex06_gsontest c MainActivity c Student+ android dependencies (compile fil eTree (dir: libs, include: *. jar)androidTestCoinpile(,com. android, support, test, espresso:espresso-core:2. 2. 2, exclude group: , com. android, support, module: support-annotations)compile c

19、om. android, support:appcompat-v7:25. 3.1compile com. android, support, constraint:constraint-1ayout:1. 0. 2testCompile , junit : junit :4.12,compile com. google, code, gson:gson:2. 8. 2)(8)翻开MainActivity. java文件,实现序列化的功能,即当用户单击“序列化”按钮时,我们将使用Gson将一个Student对象序列化并输出到TextView中。Student student = new Stu

20、dent (“18010001,“张三”,18);Gson gson = new GsonO ;tvinform. setText(gson. tojson(student);(9)在MainActivity. java文件中,实现反序列化的功能,即当用户 单击“反序列化”按钮时,我们将使用Gson将一个JSON字符串转换为 Student对象并将相关信息输出到TextView中。String json= StuName:李四,StuNum:18010002,StuAge: 17;Gson gson=new GsonO ;Student student = gson. fromjson (js

21、on, Student, class);tvinform. setText (生成 Student 对象:+ student. getStuName ()+ 成功);(10)下面以显示图文混排的球队信息为例,使用Gson来解析JSON数 据。新建工程 “SoccerTeams”,设计 MainActivity 界面。Component Trw zooSoccerTeams zooSoccerTeams N ComtraintUyouta tvNoData (TextView)三 IvTeoms (ListView)item 1SubltomlItem 2SubltemJHem 3Sub ite

22、m 3Item 4Subitfn4没有故累Item 5SubitomSItem 6Sub Item 6Item 7Subitem7Hem 8Sub item 8 soccer, png 和 goodl. jpg 文件复制到 res/drawable 目录下。然后,在res/layout目录下,新建ListView数据项的布局文 件 item_team. xmloSoccerTeamsText Vie。Textv,ew 17:001OComponent TreeN ConstraintLayout5 imgFlag (ImageView)Ab tvTeamName (TextView)Ab tv

23、SupportCount (TextView)5 imgGood (ImageView)(12)在浏览器中输入如下网址,测试服务端工作是否正常。 :/ 10. 1. 102. 44/SoccerDataHandler. ashx?action=getTeamWithFlagListo(13)引入 Gson2.8. 2。(14)因为在本工程中,服务端已经完成了对数据的序列化,因此 Android端只需要将JS0N数据反序列化生成数据对象即可。而通过Gson 进行反序列化操作,首先需要根据返回数据定义相应的实体类,当数据 结构比拟简单时,我们可以直接手工实现,但当数据较为复杂时,就比 较麻烦了。这

24、里通过引入GsonFormat插件来自动完成实体类的定义工 作。(15)单击菜单 “File” 一 “Settings” 选项,弹出 “Settings” 对话 框。选择“Pulgins”,然后单击Browse repositories”按钮,弹出Browse repositories” 对话框。搜索“GsonFormat”,然后单击Install ” 按钮, 等待安装完成。根据系统提示,重启Android StudiOo(16)然后,我们使用GsonFormat插件来自动生成实体类的定义。新建包cn. edu. szpt. soccerteams, beans 并在该包中,新建实体类Team

25、Beano(17)翻开TeamBean类,按下“Alt+Insert”快捷键,在弹出的菜单中选择“GsonFormat”命令。1.课程设计(1)回顾上一章的内容,提出本次课程的目标一一配置服 务端,并使用异步任务实现网络通信。(2)首先翻开控制面板程序启用或关闭Windows功能。勾选HS及Asp. net4. 7,然后点击确定。同 Windows 功能一 口 X启用或关闭Windows功能假设要启用一种功能,请选择其复选框。假设要关闭一种功能,请清除其复选框。填充的框表示仅启用该功能的一局部。Internet Information ServicesInternet田回 .NET Frame

26、work 3.5 (包括.NET 2.0 和 3.0) BPI口回回FTP服务器 Web管理工具 万维网服务hj承载的Web核心口口0一Legacy ComponentsMicrosoft Message Queue (MSMQ)服务器Microsoft Print to PDF确定取消(3)完成后,在浏览器中输入localhost,测试是否成功。(4)下面我们将在HS中配置我们的服务端,首先,翻开 器。管理public class TeamBean (GenerateConstructor toStringO Ovairida MathcrkCtrl+CGsonFormatCopyright

27、(18)在弹出的对话框中,将服务端返回的JSON数据粘贴到文本框中, 然后,单击“0K”按钮,GsonFormat将会自动列出JS0N数据中的键Key、 值Value、数据类型以及生成的实体类中建议的成员变量名称。单击“0K” 按钮,GsonFormat将会自动根据JS0N数据生成实体类的代码。(19)新建包“cn. edu. szpt. soccerteams, adapters,并在该包下,新 建类 TeamAdapter,继承自 BaseAdapter。public class TeamAdapter extends BaseAdapter private Context context

28、;private List list;public TeamAdapter(Context context, List list) this.context = context;this.list = list;)Overridepublic int getCount () return list, size();Overridepublic Object getltem(int position) return list.get (position);Overridepublic long getltemld(int position) return position;)Overridepu

29、blic View getView(int position, View convertView, ViewGroup parent) (if(convertView=null)convertView= Layoutlnflater. from(context). inflate(R. layout, item team, parent, fal se);)ImageView imgFlag= (ImageView)convertView. findViewById(R. id. imgFlag);TextView tvTeam= (TextView)convertView. findView

30、Byld(R. id. tvTeamName);TextView tvSupportCount= (TextView) convertView. findViewById(R. id.tvSupportCouImageView imgGood= (ImageView)convertView. findViewById(R. id. imgGood);final TeamBean bean=list.get (position);tvTeam. setText(bean. getCountry();tvSupportCount. setText (bean. getVotenumO + );re

31、turn convertView;) )(20)修改MainActivity. java中的代码,为ListView设置适配器。public class MainActivity extends AppCompatActivity private ListView IvTeams;private TextView tvnodata;private List list;private TeamAdapter adapter;Overrideprotected void onCreate (Bundle savedInstanceState) super. onCreate(savedlnstan

32、ceState);setContentView(R. layout. activity_main);IvTeams=(ListView) findViewById(R. id. IvTeams);tvnodata= (TextView) findViewById(R. id. tvNoData);IvTeams. sctEmptyVicw(tvnodata);list二new ArrayList();adapter=new TeamAdapter(this,list);IvTeams. setAdapter(adapter);)(21)点击运行,此时不会显示数据,因为我们还没有获取网络传输的

33、数据。新建包“cn. edu. szpt. soccerteams, tasks”,并在该包中,新建类 JsonGetTask,继承自AsyncTask,并实现相关代码,public class JsonGetTask extends AsyncTask private List list;private TeamAdapter adapter;public JsonGetTask(List list, TeamAdapter adapter) this.list = list;this, adapter = adapter; Overrideprotected String doInBack

34、ground (String. . params) try URLConnection con二( URLConnection) new URL(params0). openConnection 0;con. connect ();int code=con. getResponseCode();if(code= URLConnection. _0K)InputStream is=con. getInputstream();ByteArrayOutputStream baos=new ByteArrayOutputStream(); int n=0;byte buf=new byte 1024;

35、while(n=is. read(buf)!=-l) baos. write (buf, 0, n);)String json= baos. toString(UTF-8); return json;) con. disconnect (); catch (lOException e) e.printStackTrace();) return null; )Overrideprotected void onPostExecute(String s) if(s!=null)List jsonList= new Gson0. fromjson(s, new TypeTokenList(). get

36、Type(); list, clear();list. addAll(jsonList);adapter. notifyDataSetChanged 0; ) ) (22)切换回MainActivity. java中,修改相关代码,调用异步任务, 实现网络访问。new JsonGetTask(list, adapter). execute(“ :/ 10. 1. 102. 44/SoccerDataIIandler. ashx?action= getTeamWithFlagList );(23)设置网络访问权限。(24)点击运行,可以显示文字信息,但不能显示国旗图片。因为在服 务器返回的JS0

37、N数据中,国旗的数据是图片的名称,不能直接在 ImageView中显示,需要我们在填充每一行数据时,另外启动一个异步任 务,根据服务端的路径和图片名称来获取网上的图片。(25 )在包“cn. edu. szpt. soccerteams, tasks ”下,新建类 ImageGetTask,继承自AsyncTasko因为所有国家的图片都放在服务端的 同一个路径下,“ : 10. 1. 102. 44/images/,在这个路径下,拼上 图片名称,就构成了指定图片的路径。因此,这里我们采用两个参数连 接起来,从而得到具体的路径。public class ImageGetTask extends

38、AsyncTask private ImageView img;public ImageGetTask(ImageView img) this, img = img;) Overrideprotected Bitmap doInBackground(String. params) try URLConnection con = ( URLConnection) new URL( params0 +params1). openConnection();int code = con. getResponseCode ();if (code 二= 200) InputStream is = con.

39、 getlnputStreamO ;Bitmap bmp = BitmapFactory. decodeStream(is); return bmp;) catch (lOException e) e. printStackTrace ();return null;)Overrideprotected void onPostExecute(Bitmap bitmap) if (bitmap != null)img. setlmageBitmap(bitmap);)(26)修改TeamAdapter代码,在getView()方法中添加对图片的访问。public View getView(int

40、position, View convertView, ViewGroup parent) /此处省略局部代码。tvTeam. setText(bean. getCountry();tvSupportCount. setText (bean. getVotenumO + ); newImageGetTask (imgFlag). execute (z, : /10. 1. 102. 44/images/, bean. getFlagO);return convertView;)(27)点击运行,验证程序能否正确运行,了解学生进度。作业:教学单元:移动应用开发(15)授课班级:授课时间:2教学地

41、点:教学目的:应知:1、了解产生图片错位现象的原因;2、了解图片缓存的基本原理;应会:7、 能够解决图片错位问题;能够使用图片缓存技术提升用户体验;8、 能实现Android网络通信程序。教学重点、难点:5. 图片错位的原因理解6. 图片缓存技术教学方法:根据本堂课教学内容的重点与难点,教学过程中主要采用以下教学方法:7. 在理论教学上,主要在钉钉平台上进行,以讲授和教学演示为主,通过提 问引导学生发现问题、分析问题,掌握Android软件开发的基本概念和流 程。8. 在实践教学上,采用“实例引导,工程驱动”的方式讲授。通过实现相关 实例,在实例基础上改造拓宽,真正实现“学以致用二钉钉和QQ相

42、结 合,采用演示、实践和讨论相结合的模式。9. 注重教学整体过程设计,依托网络平台,将课前预习、课中讲授与演练和课后练习与讨论答疑有机结合,不断摸索提高教学效果。教学过程设计:备注:1.课程设计(1)回顾上一节课的内容,提出本次课程的目标一一如何 处理图片显示错位及图片缓存问题。(2)因为我们目前客户端和服务端都在同一个电脑上,所 以网络的延时基本可以忽略,这里,我们在SoccerTeams工 程中,翻开ImageGetTask异步任务,修改代码,添加50ms 的延时,用来模拟网络的延时。此时,当我们快速上下滑动 ListView的过程中,可以发现对应的国旗显示会有明显的延 时且会出现错位的情

43、况。(3)分析ListView中图片错位的原因一一复用+异步操作 是图片错位的原因。并提出针对性的解决方法,即当开始启 动异步任务获取图片时,在异步任务中以及ImageView的 tag属性记录当前item的特征(比方position),当异步任 务完成后,需要设置图片时,先比拟ImageView的tag和该 异步任务中记录的值是否一致,一致那么显示图片,否那么丢弃 获取的图片。public class ImageGetTask extends AsyncTask private ImageView img;private int position;public ImageGetTask(Im

44、ageView img, int position) this, img = img;this.position = position;)/oooooo省略局部代码。Overrideprotected void onPostExecute(Bitmap bitmap) if (bitmap != null & (int)img. getTag()=position) img. setlmageBitmap(bitmap);).)(4)修改TeamAdapter中getView()方法中代码,在启动 ImageGetTask异步任务之前,利用ImageView对象的tag记录 position

45、值。public class TeamAdapter extends BaseAdapter /oooooo省略局部代码。Overridepublic View getView(int position, View convertView, ViewGroup parent) /oooooo省略局部代码。imgFlag. setTag(position);imgFlag. setlmageResource(R. drawable, soccer);new ImageGetTask(imgFlag, position), execute(. 1. 102. 44/images/75,bean, get Flag ();return convertView;)(5)此时,运行时快速上下滑动,不会出现图片错位的问题,当对应图 片下载完成前,显示统一的soccer, png图片。但是每次滑动都需要重复 连接网络,重新下载图片,用户体验不好。为解决这个问题,我们采用

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁