AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第七章 网络编程_第1页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第七章 网络编程_第2页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第七章 网络编程_第3页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第七章 网络编程_第4页
AndroidStudio项目开发教程-从基础入门到乐享开发 课件 第七章 网络编程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

第七章网络编程安卓·入门与开发目录7.1 通过Http访问网络7.2 解析JSON格式数据7.3 网络查询手机号码归属地7.1

通过Http访问网络在Android中可以使用HTTP协议访问网络。例如,在应用商店下载软件时,或者刷新朋友圈时,都需要通过HTTP协议访问网络。Http协议工作原理大致可以理解为:客户端向服务器发出一条HTTP请求,服务器收到请求后返回一些数据给客户端,客户端对收到的数据进行解析。在Android6.0以前,Android上发送Http请求主要有两种方式:HttpURLConnection和HttpClient。其中HttpClient存在过多的API且难扩展,于是在Android6.0系统中,HttpClient被完全移除,如需使用,需导入相应文件。所以这里主要介绍HttpURLConnection的基本使用方法。HttpURLConnection类位于包中,用于发送HTTP请求和获取HTTP响应。由于该类是抽象类,不能直接实例化对象,则需要使用URL的openConnection方法来获得。例如,要创建一个网站对应的HttpURLConnection对象,可以使用下面的代码:Url

url=

newURL(“/”);HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();HttpURLConnection是URLConnection的一个子类,它在URLConnection的基础上提供来如表7.1的方法,方便发送和响应HTTP请求。创建HttpURLConnection对象后,就可以使用该对象发送HTTP请求了。表7.1HttpURLConnection常用的方法方法描述IntgetResponseCode()获取服务器的响应代码StringgetResponseMessage()获取服务器的响应消息StringgetRequestMethod()获取发送请求的方法voidsetRequestMethod(Stringmethod)设置发送请求的方法7.1通过Http访问网络7.1 通过Http访问网络目录7.3 网络查询手机号码归属地7.1 通过Http访问网络7.2 解析JSON格式数据7.1.1发送GET请求7.1.2发送POST请求7.1.1发送GET请求使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。使用HttpURLConnection对象发送请求时,默认发送的GET请求。因此发送GET请求比较简单,只需要在指定连接地址时,先将要传递的参数通过“?参数名=参数值”的形式进行传递(多个参数间可以使用英文半角的“&”符号分隔。),然后获取输入流中的数据,并关闭连接即可。7.1通过Http访问网络7.1 通过Http访问网络7.1.1发送GET请求7.1.2发送POST请求7.1.2发送POST请求使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。

在Android中使用HttpURLConnection类发送请求时,如果要发送POST请求,需要通过其setRequestMethod方法进行指定。例如,创建一个HTTP连接,并为该连接指定请求的发送方式为POST,可以使用下面的代码:Url

url=

newURL(“/”);HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();urlConn.setRequestMethod(“POST”);

发送POST请求要比发送GET请求复杂一些,它需要通过HttpURLConnection类及其父类URLConnection提供的方法设置相关内容,常用的方法如表7.2所示:

表7.2发送POST请求时常用的方法方法描述setDoOutput(true);//需要输出设置是否向连接中写入数据,true表示写入数据;否则表示不写入数据。setDoInput(true);//需要输入设置是否从连接中读取数据,true表示读取数据;否则表示不读取数据。setUseCaches(false);//不允许缓存设置是否需要缓存数据,true表示缓存数据,否则表示禁用缓存。SetInstanceFollowRedirects(BooleanfollwRedirects)设置是否应该自动执行HTTP重定向,true表示自动执行,否则不自动执行。setRequestProperty设置一般请求属性,如需要设置内容类型为表单数据,代码为setRequestProperty("Content-Type","Application/x-www-form-urlencoded");7.1通过Http访问网络7.1 通过Http访问网络7.2 解析JSON格式数据7.3 网络查询手机号码归属地7.2 解析JSON格式数据目录7.2.1JSON简介7.2.2解析JSON数据7.2解析JSON格式数据7.2.1JSON简介使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,用于数据的标记、存储和传输,其语法简洁,不仅易于阅读和编写,也易于机器的解析和生成。具有以下特点:

轻量级的文本数据交换格式

独立于语言和平台

具有自我描述性

读写速度快,解析简单如下代码所示,JSON通常由名称/值、对象(名称/值形式的映射)和数组等三种方式组成。JSON没有变量或者其他控制,只用于数据传输。{"userInfo":{"user":[{"name":"zhangsan","year":"5"},{"name":"lisi","year":"4"}],"database":[{"name":"shop","size":"2"}]}}Ø“名称/值”对无序、一个对象用“{}”包括,名称和值间用“:”相隔,对象间用“,”隔开;"name":"zhangsan"Ø

对象一个JSON对象包括多个名称/值对,在花括号里书写{"name":"zhangsan","year":"5"}Ø

数组数组以“[]”包括,数据的对象用逗号隔开[{"name":"zhangsan","year":"5"},{"name":"lisi","year":"4"}]7.2解析JSON格式数据7.2解析JSON格式数据7.2.1JSON简介7.2.2解析JSON数据使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。7.2.2解析JSON数据Android提供了用来解析JSON数据的JSONObject和JSONArray对象。其中JSONObject用于解析JSON对象;JSONArray用于解析数组。如需要解析的格式为:{"student":[{"id":1,"name":"小明","sex":"男","age":18,"height":175},{"id":2,"name":"小红","sex":"女","age":19,"height":165},{"id":3,"name":"小强","sex":"男","age":20,"height":185}],"school":"第一中学"}解析的代码如下所示:StringjsonStr=”…”//jsonStr为要解析的json字符串JSONObjectroot=newJSONObject(jsonStr.toString());//根据键名获取键值信息System.out.println("root:"+root.getString("cat"));JSONArrayarray=root.getJSONArray("student");for(inti=0;i<array.length();i++){JSONObjectstud=array.getJSONObject(i);System.out.println("------------------");System.out.print("id="+stud.getInt("id")+","));System.out.print("name="+stud.getString("name")+","));System.out.print("sex="+stud.getString("sex")+","));System.out.print("age="+stud.getInt("age")+","));System.out.println("height="+stud.getInt("height")+","));}7.2解析JSON格式数据目录7.1 通过Http访问网络7.2 解析JSON格式数据7.3 网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。7.3

网络查询手机号码归属地本章首先介绍了如何通过HttpURLConnection访问网络,在本项目中将实现通过HttpURLConnection访问网络来查询手机归属地。

1、在fragment_mine.xml添加一个LinearLayout布局,往LinearLayout布局里添加两个ImageView组件和一个TextView组件,用来显示归属地查询功能入口。<!--归属地查询--><LinearLayoutstyle="@style/Mine_Item_Style"><ImageViewandroid:src="@drawable/mr_mine5"style="@style/Mine_Image_Style"/><TextViewandroid:text="归属地查询"android:id="@+id/phone_query"style="@style/Mine_Text_Style"/><ImageViewandroid:src="@drawable/mr_right_to"style="@style/Mine_Image_Style"/></LinearLayout>7.3网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。2、在MineFragment类里声明号码归属地TextView组件phone_query,查询结果集result以及查询号码phone。在initView方法里初始化组件phone_query,在setListener方法里添加点击监听事件。privateTextViewphone_query;//号码归属地查询组件Stringresult="";//查询结果Stringphone="";//查询号码/***初始化组件*@paramview*/@OverridepublicvoidinitView(Viewview){super.initView(view);login=(TextView)view.findViewById(R.id.custom_login);sp=getActivity().getSharedPreferences("UserData",Context.MODE_PRIVATE);phone_query=(TextView)view.findViewById(R.id.phone_query);}/***设置监听*/@OverridepublicvoidsetListener(){login.setOnClickListener(this);phone_query.setOnClickListener(this);}7.3网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。3、

在MineFragment类里初始化handle消息对象,用来提示查询消息。privateHandlerhandler=newHandler(newHandler.Callback(){@OverridepublicbooleanhandleMessage(Messagemsg){switch(msg.what){case1://1请求成功try{//根据返回值格式,解析返回数据JSONObjectjsonObject=newJSONObject(result);JSONObjectjsonObject2=newJSONObject(jsonObject.getString("response"));JSONObjectjsonObject3=newJSONObject(jsonObject2.getString(phone));//提示手机号码归属地Toast.makeText(getActivity(),phone+":"+jsonObject3.getString("location"),Toast.LENGTH_SHORT).show();}catch(JSONExceptione){e.printStackTrace();Toast.makeText(getActivity(),"查询失败,请重新输入有效号码!",Toast.LENGTH_SHORT).show();}break;case0://1请求失败Toast.makeText(getActivity(),"查询失败,请重新输入有效号码!",Toast.LENGTH_SHORT).show();break;}returnfalse;}});7.3网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。4、

在MineFragment类里新建getPhoneAddres方法用来请求网络数据。/***请求网络数据,获取手机号码归属地**@param*/publicvoidgetPhoneAddres(){//判断手机号码不为空,则请求网络接口if(phone!=null&&!"".equals(phone)&&!"".equals(phone)&&phone.trim().length()>10){newThread(newRunnable(){@Overridepublicvoidrun(){try{//接口来源网络URLurl=newURL("/dianhua_api/open/location?tel="+phone+"&t="+newDate().getTime());//新建HttpURLConnection对象HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();//设置请求类型为getconnection.setRequestMethod("GET");//连接、请求时长connection.setConnectTimeout(5000);connection.setReadTimeout(5000);//设置http请求头,防止乱码}connection.setRequestProperty("Content-Type","Application/x-www-form-urlencoded");connection.setRequestProperty("charset","UTF-8");connection.setRequestProperty("Accept-Charset","utf-8");connection.setRequestProperty("contentType","utf-8");StringBuilders=newStringBuilder();//判断是否请求成功if(connection.getResponseCode()==200){InputStreamReaderin=newInputStreamReader(connection.getInputStream());BufferedReaderbuffer=newBufferedReader(in);StringinputLine=null;//接收返回结果集while((inputLine=buffer.readLine())!=null){result+=inputLine;}//接收完消息,发送handler消息队列,提示消息handler.obtainMessage(1,result).sendToTarget();}}catch(Exceptione){e.printStackTrace();}}}).start();}else{handler.obtainMessage(0,result).sendToTarget();}7.3网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。该方法的语法格式如下:getPreferences(intmode)其中,参数mode的取值同getSharedPreferences方法相同。5、

在MineFragment类里新建showPhoneDialog方法,用来展示查询手机号码对话框。当点击“确定”按钮,初始化手机号码和返回结果,触发getPhoneAddres方法请求网络数据。/*@setIcon设置对话框图标*@setTitle设置对话框标题*@setMessage设置对话框消息提示*setXXX方法返回Dialog对象,因此可以链式设置属性*/privatevoidshowPhoneDialog(){finalAlertDialog.BuildernormalDialog=newAlertDialog.Builder(getActivity());finalEditTextet=newEditText(getActivity());normalDialog.setTitle("提示");normalDialog.setView(et);normalDialog.setMessage("请输入查询的手机号码?");normalDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){//重写“确定”按钮点击事件,点击“确定”按钮,根据号码请求网络接口,获取号码归属地@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){phone=et.getText().toString();result="";getPhoneAddres();}});normalDialog.setNegativeButton("关闭",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//...To-doresult="";}});//显示

normalDialog.show();}7.3网络查询手机号码归属地使用Activity类中的getPreferences方法获取如果Activity仅需要一个SharedPreferences文件,则可以使用getPreferences方法获取。因为只有一个文件,所以不需要提供名称。

温馨提示

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

评论

0/150

提交评论