Android官方开发文档Training系列课程中文版:网络操作之网络连接

原文地址:http://android.xsoftlab.net/training/basics/network-ops/index.html

引言

这节课将会学习最基本的网络连接,监视网络连接状况及网络控制等内容。除此之外还会附带描述如何解析、使用XML数据。

这节课所包含的示例代码演示了最基本的网络操作过程。开发者可以将这部分的代码作为应用程序最基本的网络操作代码。

通过这节课的学习,将会学到最基本的网络下载及数据解析的相关知识。

Note: 可以查看课程Transmitting Network Data Using Volley学习Volley的相关知识。这个HTTP库可以使网络操作更方便更快捷。Volley是一个开源框架库,可以使应用的网络操作顺序更加合理并善于管理,还会改善应用的相关性能。

连接到网络

这节课将会学习如何实现一个含有网络连接的简单程序。课程中所描述的步骤是网络连接的最佳实现过程。

如果应用要使用网络操作,那么清单文件中应该包含以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

选择HTTP客户端

大多数的Android应用使用HTTP来发送、接收数据。Android中包含了两个HTPP客户端:HttpURLConnection及Apache的HTTP客户端。两者都支持HTTPS,上传,下载,超时时间配置,IPv6,连接池。我们推荐在Gingerbread及以上的版本中使用HttpURLConnection。有关这个话题的更多讨论信息,请参见博客Android’s HTTP Clients.

检查网络连接状况

在尝试连接到网络之前,应当通过getActiveNetworkInfo()方法及isConnected()方法检查网络连接是否可用。要记得,设备可能处于不在网络范围的情况中,也可能用户并没有开启WIFI或者移动数据。该话题的更多信息请参见 Managing Network Usage.

public void myClickHandler(View view) {...ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isConnected()) {// fetch data} else {// display error}...
}

在子线程中执行网络操作

网络操作所用的时间通常是不确定的。为了防止由于网络操作而引起的糟糕的用户体验,应该将这个过程放入独立的线程中执行。AsyncTask类为这种实现提供了帮助。更多该话题的讨论请参见Multithreading For Performance。

在下面的代码段中,myClickHandler()方法调用了new DownloadWebpageTask().execute(stringUrl)。类DownloadWebpageTask是AsyncTask的子类。DownloadWebpageTask实现了AsyncTask的以下方法:

  • doInBackground()中执行了downloadUrl()方法。它将Web页的URL地址作为参数传给了该方法。downloadUrl()方法会获得并处理Web页面的内容。当处理结束时,这个方法会将处理后的结果返回。
  • onPostExecute()获得返回后的结果将其显示在UI上。
public class HttpExampleActivity extends Activity {private static final String DEBUG_TAG = "HttpExample";private EditText urlText;private TextView textView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);   urlText = (EditText) findViewById(R.id.myUrl);textView = (TextView) findViewById(R.id.myText);}// When user clicks button, calls AsyncTask.// Before attempting to fetch the URL, makes sure that there is a network connection.public void myClickHandler(View view) {// Gets the URL from the UI's text field.String stringUrl = urlText.getText().toString();ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isConnected()) {new DownloadWebpageTask().execute(stringUrl);} else {textView.setText("No network connection available.");}}// Uses AsyncTask to create a task away from the main UI thread. This task takes a // URL string and uses it to create an HttpUrlConnection. Once the connection// has been established, the AsyncTask downloads the contents of the webpage as// an InputStream. Finally, the InputStream is converted into a string, which is// displayed in the UI by the AsyncTask's onPostExecute method.private class DownloadWebpageTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... urls) {// params comes from the execute() call: params[0] is the url.try {return downloadUrl(urls[0]);} catch (IOException e) {return "Unable to retrieve web page. URL may be invalid.";}}// onPostExecute displays the results of the AsyncTask.@Overrideprotected void onPostExecute(String result) {textView.setText(result);}}...
}

上面的代码执行了以下操作:

  • 1.当用户按下按钮时会调用myClickHandler()方法,应用会将指定的URL地址传递给DownloadWebpageTask。
  • 2.DownloadWebpageTask的doInBackground()方法调用了downloadUrl()方法。
  • 3.downloadUrl()方法将获得的URL字符串作为参数创建了一个URL对象。
  • 4.URL对象被用来与HttpURLConnection建立连接。
  • 5.一旦连接建立,HttpURLConnection会将获取到的Web页面内容作为输入流输入。
  • 6.readIt()方法将输入流转换为String对象。
  • 7.最后onPostExecute()方法将String对象显示在UI上。

连接与下载数据

在执行网络传输的线程中可以使用HttpURLConnection来执行GET请求并下载输入。在调用了connect()方法之后,可以通过getInputStream()方法获得输入流形式的数据。

在doInBackground()方法中调用了downloadUrl()方法。downloadUrl()方法将URL作为参数通过HttpURLConnection与网络建立连接。一旦连接建立,应用通过getInputStream()方法来接收字节流形式的数据。

// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {InputStream is = null;// Only display the first 500 characters of the retrieved// web page content.int len = 500;try {URL url = new URL(myurl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(10000 /* milliseconds */);conn.setConnectTimeout(15000 /* milliseconds */);conn.setRequestMethod("GET");conn.setDoInput(true);// Starts the queryconn.connect();int response = conn.getResponseCode();Log.d(DEBUG_TAG, "The response is: " + response);is = conn.getInputStream();// Convert the InputStream into a stringString contentAsString = readIt(is, len);return contentAsString;// Makes sure that the InputStream is closed after the app is// finished using it.} finally {if (is != null) {is.close();} }
}

注意getResponseCode()方法返回的是连接的状态码。该状态码可以用来获取连接的其它信息。状态码为200则表明连接成功。

将字节流转换为字符串

InputStream所读取的是字节数据。一旦获得InputStream对象,通常需要将其解码或者转化为其它类型的数据。比如,如果下载了一张图片,则应该将字节流转码为图片:

InputStream is = null;
...
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);

在上的示例中,InputStream代表了Web页面的文本内容。下面的代码展示了如何将字节流转换为字符串:

// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {Reader reader = null;reader = new InputStreamReader(stream, "UTF-8");        char[] buffer = new char[len];reader.read(buffer);return new String(buffer);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法工程师的落地能力具体指的是什么?

文 | 桔了个仔知乎本文已获作者授权&#xff0c;禁止二次转载大家好&#xff0c;这里是桔了个仔&#xff0c;目前是一名Data Scientist(不太想翻译成数据科学家&#xff0c;毕竟感觉自己就是个工程师&#xff09;&#xff0c;过去几年在做基于机器学习的风控与合规系统&#xf…

国内外自然语言处理(NLP)研究组

2015年国内外自然语言处理(NLP)研究组&#xff1a; https://blog.csdn.net/wangxinginnlp/article/details/44890553 补充&#xff1a; 名称 地址 最近更新 HanLP https://github.com/hankcs/HanLP 2天前 腾讯开源深度学习文本分类工具 https://github.com/Tencent/NeuralNLP-…

Android官方开发文档Training系列课程中文版:网络操作之网络管理

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/network-ops/managing.html 这节课将会学习如何对网络资源的使用情况拥有更细粒度的控制力。如果应用程序经常执行大量的网络操作&#xff0c;那么程序应当提供一项设置&#xff0c;以便用户可以控制应用的数…

LeetCode 728. 自除数

1. 题目 自除数 是指可以被它包含的每一位数除尽的数。 例如&#xff0c;128 是一个自除数&#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 还有&#xff0c;自除数不允许包含 0 。 给定上边界和下边界数字&#xff0c;输出一个列表&#xff0…

论文浅尝 - AAAI2020 | 通过句子级语义匹配和答案位置推断改善问题生成

论文笔记整理&#xff1a;王春培&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/1912.00879.pdf动机本文主要聚焦问答系统&#xff08;Q&A&#xff09;的反问题---问题生成&#xff08;Question Generation&#xff0c;Q&G&#xff09;。问题生成的…

美团深度学习系统的工程实践

背景 深度学习作为AI时代的核心技术&#xff0c;已经被应用于多个场景。在系统设计层面&#xff0c;由于其具有计算密集型的特性&#xff0c;所以与传统的机器学习算法在工程实践过程中存在诸多的不同。本文将介绍美团平台在应用深度学习技术的过程中&#xff0c;相关系统设计的…

一个程序员的理财观

文 | 王喆你好&#xff0c;我叫王喆&#xff0c;看过我技术文章的朋友知道&#xff0c;我是一个搞推荐系统的机器学习工程师&#xff0c;不熟悉的同学也没关系&#xff0c;就当我是一名普普通通的程序员就好。但今天我们不谈技术&#xff0c;也不谈996这些烦人的话题&#xff0…

Android官方开发文档Training系列课程中文版:网络操作之XML解析

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/network-ops/xml.html 扩展标记语言(XML)是一系列有序编码的文档。它是一种很受欢迎的互联网数据传输格式。像需要频繁更新内容的网站来说&#xff0c;比如新闻站点或者博客&#xff0c;需要经常更新它们的X…

2020年最值得收藏的60个AI开源工具

原本链接:https://www.infoq.cn/article/2uabiqaxicqifhqikeqw 本文&#xff0c;InfoQ梳理了60个2019年至今GitHub上热门的开源工具&#xff0c;献给那些对新征程满怀期待的开发者们。Flair (顶级 NLP 库&#xff09;2018 年是 NLP 井喷的一年。像 ELMo 和谷歌 BERT 这样的库层…

LeetCode 942. 增减字符串匹配

1. 题目 给定只含 “I”&#xff08;增大&#xff09;或 “D”&#xff08;减小&#xff09;的字符串 S &#xff0c;令 N S.length。 返回 [0, 1, …, N] 的任意排列 A 使得对于所有 i 0, …, N-1&#xff0c;都有&#xff1a; 如果 S[i] "I"&#xff0c;那么…

Netty堆外内存泄露排查盛宴

导读 Netty 是一个异步事件驱动的网络通信层框架&#xff0c;用于快速开发高可用高性能的服务端网络框架与客户端程序&#xff0c;它极大地简化了 TCP 和 UDP 套接字服务器等网络编程。 Netty 底层基于 JDK 的 NIO&#xff0c;我们为什么不直接基于 JDK 的 NIO 或者其他NIO框架…

论文浅尝 - ESWC2020 | YAGO 4: A Reason-able Knowledge Base

论文笔记整理&#xff1a;叶群&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。会议&#xff1a;ESWC 2020链接&#xff1a;https://suchanek.name/work/publications/eswc-2020-yago.pdfIntroductionYAGO是世界上最大的链接数据库之一&#xff0c;由德国马普研…

责任链模式在Android中的应用

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 责任链其实在Android中出现的频率还蛮高的&#xff0c;事件传递就是一种责任链机制。接下来我为大家介绍在开发应用时责任链的用处&#xff1a; 1.触摸事件的应用。2.响应事件的应用。 何为责任…

sklearn网格搜索找寻最优参数

大家好&#xff0c;在机器学习中&#xff0c;调参是一个非常重要的步骤&#xff0c;它可以帮助我们找到最优的模型参数&#xff0c;从而提高模型的性能。然而&#xff0c;手动调参是一项繁琐且耗时的工作&#xff0c;因此需要一种自动化的方法来搜索最佳参数组合。在这方面&…

最新版《神经网络和深度学习》中文版.pdf

获取最新版《神经网络和深度学习》最新版PDF和PPT的方法&#xff1a; 1.扫码关注 “Python与机器智能” 公众号2.后台回复关键词&#xff1a;神经网络注&#xff1a;此处建议复制&#xff0c;不然容易打错▲长按扫描关注&#xff0c;回复神经网络即可获取文档目录如下获取最新版…

一文盘点PaddlePaddle官方九大自然语言处理模型

一文盘点PaddlePaddle官方九大自然语言处理模型&#xff1a;百度paddlepaddle模型

论文浅尝 | 知识图谱的不确定性衡量

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;Knowledge and Information Systems volume 62, pages611–637(2020)链接&#xff1a;https://link.springer.com/article/10.1007/s10115-019-01363-0概要本文的核心工作是利用知识结构来衡量知识库…

LeetCode 709. 转换成小写字母

1. 题目 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小写字母&#xff0c;之后返回新的字符串。 2. 解题 char tolower(char)小写比大写对应字符大32 class Solution { public:string toLowerCase(strin…

Logan:美团点评的开源移动端基础日志库

前言 Logan是美团点评集团移动端基础日志组件&#xff0c;这个名称是Log和An的组合&#xff0c;代表个体日志服务。同时Logan也是“金刚狼”大叔的名号&#xff0c;当然我们更希望这个产品能像金刚狼大叔一样犀利。 Logan已经稳定迭代了一年多的时间。目前美团点评绝大多数App已…

如何实现一个循环显示超长图片的控件

*本篇文章已授权微信公众号 guolin_blog &#xff08;郭霖&#xff09;独家发布 某次被问到如何实现一个滚筒状的控件&#xff0c;就是可以将一张很长的图片沿着Y轴无限旋转&#xff0c;如下图所示&#xff1a; 大概就是这个意思&#xff0c;当时还不知道图片可以裁剪&…