




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章Android网上冲浪 Android手机除了最基本的电话和短信之外我想大家用的最多的就是上网功能了 Android作为一个网络操作系统 对网络的支持无疑是非常强大的 本章就将学习网络方面的API 通过本章的学习 读者朋友们将能够编写自己的HTTP客户端 学会使用HTTP协议发送和接受数据 同时将会编写自己的个性浏览器 11 1使用HttpUrlConnection 在网络中最常见的数据传输方式就是超文本传输协议 HTTP HyperTextTransferProtocol 了 本节我们将使用HttpUrlConnection类进行数据的接收和发送 在传输时有两种方法可以选择 分别是GET和POST 这两种方法在使用时是有区别的 我们要根据选择的方法进行相应的代码编写 11 1 1使用GET方法 在HTTP协议中GET常被用来查询数据 它的参数可以直接写在URL中 如 http 192 168 0 1 8080 index jsp id 123456 使用HttpUrlConnection的GET方法需要如下6个步骤 1 新建URL 2 得到HttpUrlConnection连接对象 3 设置该连接对象 4 得到输入流 5 从流中读取返回的结果 进行处理 6 关闭流 那么这6个步骤又是怎样实现的呢 让我们也一步一步往下看 1 新建URLURL的全称是资源描述符 它的作用是描述一个网上的资源 看上去似乎比较深奥 但是实际上 它就是我们平常的网址 如本章开始的举例 http 192 168 0 1 8080 index jsp id 123456 以上字符串作为参数传递到URL的构造函数中就可以新建一个URL对象了 代码如下 URLurl newURL http 192 168 0 1 8080 index jsp id 123456 2 得到连接对象得到连接对象时 我们不使用New方法 而是通过第一步新建的URL对象的openConnection 方法得到 代码如下 HttpURLConnectionconnection HttpURLConnection url openConnection 3 设置连接对象我们可以设置取得的连接对象的一系列属性 最常用的包括 1 允许读取 URLConnection setDoInput booleannewValue 2 允许写入 URLConnection setDoOutput booleannewValue 3 设置请求方法 HttpURLConnection setRequestMethod GET throwsProtocolException 4 设置超时时间 URLConnection setConnectTimeout inttimeout 5 设置是否允许使用缓存 URLConnection setUseCaches booleannewValue 4 得到输入流从连接中我们可以得到输入流 其方法为 URLConnection getInputStream throwsIOException 5 从流中读取结果这一步想必不要多说了 不同的流方法不一样 笔者比较推荐BufferedReader的readLine 方法 使用方便且效率不错 6 关闭流使用完流后一定要养成关闭的好习惯 流就像是自来水 大家肯定有使用完毕自来水笼头后随手关闭的习惯吧 并且工作也非常简单 调用close 方法就可以了 11 1 2使用POST方法 POST方法与GET方法不同 它的参数不能直接写在URL中 而是在HTTP的包体中 具体到实现就是要通过OutputStream写数据 除此之外POST与GET方法大同小异 使用步骤如下 1 新建URL对象 2 获得HttpUrlConnection连接对象 3 设置连接对象 注意设置请求方法为POST 4 获得输出流 写入数据 5 获得输入流 读取返回的数据 6 关闭流 将以上步骤与GET方法相比较不难发现只有第三步以及第四步存在差别 在第三步中注意使用方法 HttpURLConnection setRequestMethod POST 在第四步中获得输出流 方法为 URLConnection getOutputStream throwsIOException写入数据时要注意对数据进行编码 方法为 URLEncoder encode Strings Stringenc throwsUnsupportedEncodingException 11 1 3通过实例学习HttpUrlConnection 本节将通过一个实例来帮助读者进一步掌握HttpUrlConnection的使用 首先创建一个工程 在Activity的布局文件中添加如下3个组件 如表所示布局包含的组件表 接着进行Java部分的代码编写 1 整体设计Java整体设计的框架如下 它包括doGet 和doPost 方法的实现 publicclassHttpDemoextendsActivity TextViewtv Buttonbtn1 Buttonbtn2 OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main tv TextView findViewById R id tv btn1 Button findViewById R id post btn2 Button findViewById R id get OnClickListenerlistener newOnClickListener OverridepublicvoidonClick Viewv intid v getId if id R id post doPost else doGet btn1 setOnClickListener listener btn2 setOnClickListener listener 2 实现doGet 方法该方法用来通过GET方法进行HTTP请求 在进行网络编程时 最好将代码写在try catch 语句块中 因为处理网络编程时随时随地会遇到异常状况 例如 突然网络断开了 如服务器维护关闭了等等 publicvoiddoGet try 新建URLURLurl newURL 创建URL连接HttpURLConnectionconnection HttpURLConnection url openConnection 设置该连接允许读取connection setDoInput true 设置该连接允许写入connection setDoOutput true 设置超时connection setConnectTimeout 1000 得到连接的输入流InputStreamReaderisr newInputStreamReader connection getInputStream 再次包装为缓冲流BufferedReaderbr newBufferedReader isr 用来存放临时读取的行StringtempResult null 用来保存全部的结果Stringresult null 不停地读取行 知道结束while tempResult br readLine null 将结果保存result tempResult n 显示结果tv setText result br close isr close catch IOExceptione TODOAuto generatedcatchblocke printStackTrace 3 实现doPost 方法该方法实现了以POST进行HTTP请求 POST方法不能使用缓存 同时使用该方法必须使用OutputStream进行数据写操作 代码如下 publicvoiddoPost try 新建URLURLurl newURL 创建URL连接HttpURLConnectionconnection HttpURLConnection url openConnection 设置该连接允许读取connection setDoInput true 设置该连接允许写入connection setDoOutput true 设置连接方法为POST connection setRequestMethod POST 设置不能使用缓存 POST方法不可以使用缓存 connection setUseCaches false 开始连接 在连接前清确认设置工作全部完毕connection connect 得到输出流DataOutputStreamdos newDataOutputStream connection getOutputStream 需要写的参数Stringparams URLEncoder encode name 123456 gb2312 将参数写入到流中dos write params getBytes 将流中的数据全部写入dos flush 关闭流 dos close 得到输入流InputStreamReaderisr newInputStreamReader connection getInputStream 包装为缓冲流BufferedReaderbr newBufferedReader isr 用来存放临时读取的行StringtempResult null 用来保存全部的结果Stringresult null 不停地读取行 知道结束while tempResult br readLine null 将结果保存result tempResult n 显示结果tv setText result catch MalformedURLExceptione 如果URL不正确则抛出该异常e printStackTrace catch IOExceptione e printStackTrace 最后不要忘记在注册文件中添加权限许可 修改后的注册文件如下所示 运行以上程序 效果如下图所示 11 2使用HttpClient 为了避免进行繁琐的HttpUrlConnection的设置 Apache为我们提供了HttpClient以简化操作 它将GET方法的连接封装成了HttpGet类 将POST方法连接封装成了HttpPost类 这样我们使用起来就更方便了 11 2 1使用HttpClient进行GET连接 使用HttpClient进行GET方法的连接操作非常简单 按照如下步骤编写就可以了 1 新建URI 2 新建GET型请求 3 新建Http客户端 4 使用客户端执行请求 5 处理返回的结果 接下来我们进行每个步骤的详细解析 1 新建URI这里的URI并不是URI类 而是String类型的uri字符串就可以了 如 Stringuri 3 新建Http客户端新建客户端时 一般情况下使用默认的客户端就可以了 我们可以使用无参的构造函数得到其操作对象 DefaultHttpClient DefaultHttpClient 4 使用客户端执行请求经过以上3个步骤我们得到了客户端 并且也已经新建好了请求 可谓是万事具备 接下来的工作就是执行了 方法为 HttpClient execute HttpUriRequestrequest throwsIOException ClientProtocolException该方法的返回值是HttpResponse型 顾名思义 就是响应啦 5 处理响应得到了HttpResponse类型的响应后 在网络上的工作就完成了 接下来的事情就是在本地进行响应的处理了 如 HttpResponse getStatusLine 得到状态行HttpResponse getEntity 得到结果 11 2 2使用HttpClient进行POST连接 使用POST型连接与GET型连接大体类似 唯一的不同就是请求的建立了 步骤如下 1 新建HttpPost类型的请求同样的 我们使用带有Uri参数的构造方法创建HttpPost请求 HttpPost HttpPost Stringuri 2 新建保存参数的数据结构刚才我们已经提到 在POST中保存参数使用的是NameValuePair类 仅仅保存一个名值对肯定是不够的 所以真正的传递的是一个列表 列表中的每一个对象都是名值对 举例如下 1 新建一个列表用来保存名值对 Listparams newArrayList 2 接着新建真正的数据 以名值对的形式保存 方法为 BasicNameValuePair BasicNameValuePair Stringname Stringvalue 3 将名值对添加到列表中 List add NameValuePairobject 3 为参数设置编码方式最后将之前新建好的List型参数添加到HttpPost对象中 使用方法为 UrlEncodedFormEntity UrlEncodedFormEntity Listparameters Stringencoding throwsUnsupportedEncodingException4 将参数添加到请求中使用setEntity 方法可以将参数添加到请求中 语法格式如下 HttpEntityEnclosingRequestBase setEntity HttpEntityentity 5 新建Http客户端DefaultHttpClient DefaultHttpClient 6 使用客户端执行请求HttpClient execute HttpUriRequestrequest throwsIOException ClientProtocolException7 处理响应这里的处理就需要按照应用的需求进行代码编写了 比如将结果以String形式显示 代码如下 Stringresult EntityUtils toString httpResponse getEntity tv setText result 11 2 3通过实例学习HttpClient 接下来 依旧通过一个实例巩固HttpClient的使用方法 首先 新建一个工程 在工程中创建1个Activity 在Activity的布局文件中添加如下3个组件 如下表所示HttpClient布局包含的组件表 接着在Java代码中进行功能代码编写 1 整体设计 Java整体设计的框架如下 publicclassHttpDemoextendsActivity TextViewtv Buttonbtn1 Buttonbtn2 OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main tv TextView findViewById R id tv btn1 Button findViewById R id post btn2 Button findViewById R id get OnClickListenerlistener newOnClickListener OverridepublicvoidonClick Viewv intid v getId if id R id post doPost else doGet btn1 setOnClickListener listener btn2 setOnClickListener listener 2 实现doGet 按照11 2 1小节中讲解的5个步骤 我们可以很方便地编写出如下代码 publicvoiddoGet 新建URLStringurl 新建GET型的请求HttpGethttpRequest newHttpGet url 新建HTTP客户端HttpClienthttpClient newDefaultHttpClient try 执行请求返回结果HttpResponsehttpResponse httpClient execute httpRequest 判断结果状态if httpResponse getStatusLine getStatusCode HttpStatus SC OK 得到结果内容Stringresult EntityUtils toString httpResponse getEntity tv setText result else tv setText 应答错误 httpResponse getStatusLine toString catch ClientProtocolExceptione 客户端协议异常e printStackTrace catch IOExceptione IO异常e printStackTrace 3 实现doPost 使用POST时一定要注意参数的添加 HTTP请求中的参数是需要设置编码方式的 代码如下所示 publicvoiddoPost 新建URLStringurl 新建POST类型的请求HttpPosthttpRequest newHttpPost url 新建需要传递参数的数据结构Listparams newArrayList 新建键值对BasicNameValuePairpair1 newBasicNameValuePair param AaBbCcDdEe 将数据添加到键值对中params add pair1 try 设置编码方式HttpEntityentity newUrlEncodedFormEntity params HTTP UTF 8 httpRequest setEntity entity 新建HTTP客户端HttpClienthttpClient newDefaultHttpClient 执行请求得到响应HttpResponsehttpResponse httpClient execute httpRequest 判断响应的状态是否成功if httpResponse getStatusLine getStatusCode HttpStatus SC OK 得到结果字符串Stringresult EntityUtils toString httpResponse getEntity tv setText result else tv setText 应答错误 httpResponse getStatusLine toString catch UnsupportedEncodingExceptione 字符集编码不支持则捕获此异常e printStackTrace catch ClientProtocolExceptione 客户端协议异常e printStackTrace catch IOExceptione IO异常大家肯定不陌生了e printStackTrace 到这里代码就完成了 最后不要忘记添加INTERNET的权限许可 接下来运行代码 看看能否成功运行吧 运行后效果如下图所示 11 3自制web浏览器 本节中将详细讲解WebView的使用 并带领读者完成自己的Web浏览器 11 3 1使用WebView WebView相当于手机一个嵌入式的浏览器 可以加载并显示网页 它使用了WebKit渲染引擎 使用WebView主要步骤为 1 在布局文件中添加WebView组件 2 在Activity中实例化该组件 3 设置WebView客户端 如果不设置则使用内置的浏览器 4 加载Url 显示网页 接下来我们就开始详细讲解每个步骤的具体方法 1 在布局中添加WebView组件添加WebView组件时 我们需要使用节点 然后在其属性中添加必要的宽度 高度 id等信息就可以了 一个最简单的WebView组件的XML代码如下 2 在代码中实例化该组件与其他所有的View对象一样 我们通过Activity findViewById intid 得到其操作对象 3 设置WebView客户端得到WebView之后我们还需要为它设置客户端 如果没有设置自己的客户端 则默认使用Android自带的浏览器打开网页 既然我们要自定义WebView肯定要自己编写客户端啦 方法如下所示 WebViewClientclient newWebViewClient 在新建时 我们可以重写WebViewClient的一系列方法来达到自己的目的 下表列出了一些常用的方法 4 加载Url 显示网页将准备工作完成后 我们就可以加载Url了 方法如下 WebView loadUrl Stringurl 当然 不要忘记在注册文件中添加相关权限 需要添加的代码如下 11 3 2通过实例学习WebView 接下来我们就讲以上的知识贯穿起来 一起来编写一个自定义的WebView浏览器 并实现一些特别的功能 比如放大 缩小 前进 后退以及拍截屏等 首先新建一个工程 在Activity的布局文件中添加表11 4中所示的组件 关于这些组件怎样布局 这个问题仁者见仁智者见智 笔者的结构如下 1 xml代码Xml代码如下 TableRow android orientation horizontal android layout width fill parent android layout height wrap content Buttonandroid layout width 80dp android layout height wrap content android id id btn1 android textSize 20sp android text go 2 Java代码在Activity中 我们首先进行要进行整体设计 1 整体设计 OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main et EditText findViewById R id et1 btn Button findViewById R id btn1 实例化组件wv WebView findViewById R id wv1 得到WebView设置 settings wv getSettings 新建客户端WebViewClientclient newWebViewClient 设置客户端 如果没有设置则调用内置的浏览器wv setWebViewClient client 设置按钮监听事件btn setOnClickListener newOnClickListener OverridepublicvoidonClick Viewarg0 Stringurl et getText toString if URLUtil isNetworkUrl url 加载Url wv loadUrl url else Toast makeText getBaseContext 网址非法 Toast LENGTH SHORT show 2 完善WebView客户端刚才我们提到 WebViewClient有一系列的方法可以重写 以实现我们的目的 这里我们就重写3个方法 分别是 onPageStarted onPageFinished onLoadResource 在页面开始时 提示用户正在载入 在加载资源时 显示正在加载的Url 在页面加载结束时 将页面截屏并保存 实现的代码如下 重写页面开始加载方法 OverridepublicvoidonPageStarted WebViewview Stringurl Bitmapfavicon Toast makeText view getContext 正在载入 Toast LENGTH SHORT show super onPageStarted view url favicon 重写页面加载结束方法 OverridepublicvoidonPageFinished WebViewview Stringurl 得到网页的图片Picturepic view capturePicture 得到图片的宽和高intwidth pic getWidth intheight pic getHeight 如果宽或者高为0 则不再执行操作if width height 0 return 新建位图用以存放数据Bitmapbitmap Bitmap createBitmap width height Bitmap Config ARGB 8888 新建画布 指定要画的位图对象Canvascanvas newCanvas bitmap 将图片画到画布上pic draw canvas try 创建文件Filefile newFile sdcard pic jpg if file exists file delete file createNewFile 得到输出流FileOutputStreamfos newFileOutputStream file if fos null 将位图对象的数据压缩成JPEG格式的图片press Bitmap CompressFormat JPEG 90 fos Toast makeText view getContext 照片保存成功 Toast LENGTH SHORT show catch FileNotFoundExceptione TODOAuto generatedcatchblocke printStackTrace catch IOExceptione TODOAuto generatedcatchblocke printStackTrace super onPageFinished view url 重写加载资源方法 OverridepublicvoidonLoadResource WebViewview Stringurl Toast makeText view getContext 正在载入 url Toast LENGTH SHORT show super onLoadResource view url 此时 在你的SD卡中 应该已经保存有pic jpg图片了 此时运行程序我们可以得到效果图如下图所示 接着 我们继续实现网页的缩小 放大 前进 后退等常用功能 其实这些功能都只要调用一些简单的API就可以实现 前进 WebView goForward 后退 WebView goBack 实现放大缩小功能时 首先要得到WebView的设置对象 方法为 WebView getSettings 接下来 缩小 放大都是通过调用同一个函数实现的 WebSettings setDefaultZoom ZoomDensityzoom 放大时 ZoomDensity参数设置为 WebSettings ZoomDensity CLOSE缩小时 参数设置为 WebSettings Zo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智慧城市投资入股合同示范文本
- 2025年度预付款担保公司针对艺术品交易合同
- 2025殡葬服务绿色殡葬理念推广与应用合同
- 2025年度文化旅游区特色商铺租赁合作协议
- 2025年度高端企业市场分析及战略规划商务咨询服务合同
- 2025年度地铁隧道建设第三方监理合同范本
- 2025版体育馆室内篮球场租赁及配套器材供应合同
- 2025年特色民宿改造升级设计与施工合同
- 2025年度能源行业财务担保合同发行与会计处理规范
- 2025版新型生态绿化工程承包合同下载
- 中控室培训课件
- 自考《01685动漫艺术概论》考试复习题库(含答案)
- 2025年中考语文复习之小题狂练300题(名著阅读):《艾青诗选》《水浒传》(10题)
- 除颤仪的使用方法及操作流程课件
- 环境卫生整治项目合同范例
- ARDS患者的观察与护理
- 红色国潮风纳西族介绍模板
- 医院安防监控系统维保方案
- GB/T 44570-2024塑料制品聚碳酸酯板材
- 祖遗户遗产继承协议书范文
- 第二章 处方调剂课件
评论
0/150
提交评论