第七章--网络连接和网络数据获取

来源:互联网 发布:电脑版淘宝找不到仓库 编辑:程序博客网 时间:2024/06/05 20:16

讲道理每次最后一周的视频的数量和信息量都好可怕,作业也很有挑战。虽然死乞白赖的向辅导员请假回来,可是直到交作业的最后一天我才把作业写完,现在又马不停蹄的写笔记,所以都不记得视频讲了些啥。这次就以作业为基础说说把。

网络连接

网络是否连接

当我们从网上获取数据的时候,首先得有网且可以传递数据(感觉像废话),所以写到半路我就想万一她没联网怎么办(虽然可能性很少),当时我试了下立马就出错闪退。然后老师好像在视频里说过怎么检查网络状态,于是我照着他打出来,一运行又出错,看错误日志,还有在ManiFest中申请权限,这个老师讲过?可能我没认真听。

检查网络状态,首先得先申请权限:

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

然后以下代码就能判断网络是否连接可用了

   //首先判断网络是否连接,第一次使用的时候需要连接网络ConnectivityManager mConnectivityManager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();if (mNetworkInfo == null || !mNetworkInfo.isAvailable()){//这里是网络没有连接}else {    //这里是网络连接了的                       }

连接网络

HttpClient已经被google弃用了,来看看郭霖前辈的一席话:

在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

所以拥抱HttpURLConnection吧。以前在看别人视频的时候,都是讲的HttpClient,然而当时as中就被弃用了,如果一定要用可以在某个地方加一句话,这个网上都有。

HttpURLConnection使用也很简单,传入要访问的URL,设置请求的方法。这里是GET,就是获取信息。还有POST,可能允许修改网络上的资源,比如自己的评论。留存一个链接get/post。

URL url = new URL(urlString);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setRequestMethod("GET");            connection.setConnectTimeout(30000);            connection.connect();   int responseCode = connection.getResponseCode();            if (responseCode != HttpURLConnection.HTTP_OK){                return null;            }

当然前面不要忘记申请访问网络的权限。然后是获取对象的输出流,包装为BfferReader缓冲流,并转换为String格式。

BufferedReader bufferedReader;StringBuilder stringBuilder = new StringBuilder();InputStream inputStream = connection.getInputStream();bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));String line;if ((line = bufferedReader.readLine()) != null){    stringBuilder.append(line);    stringBuilder.append("\r\n");}bufferedReader.close();line = stringBuilder.toString();return line;

解析JSON

JSON格式的文本比xml更轻量,解析也很方便。得到网络上的资源后就是怎么解析json的问题了,有N种方法。

  • 直接用 JSONObject: 对象 ;JSONArray:数组 ;JSONStringer:String对象。这样一层一层的解析。
  • 用开源库,我采用的是google提供的GSON,这个方法好,前提得按照json的结构把实体类写好。写好之后就完美了。
    • 在as中,按照project structure-> dependencies->点击右边的+号->library dependency->输入gson。基本点击第一条选项,然后等他创建完,就可以使用GSON开源库了。
    • 然后就是创建相对应的实体类了,我用过网站和插件,都好,不过个人感觉插件更优,如果结构比较简单,也可以自己写。附上网站链接除了生成实体类还能检查json文本格式的网站。as插件就是GsonfFormat,可以自己选择生成的哪些对象。但是有时候json里命名和我们自己的变量命名有差别,这就要使用到属性重命名 @SerializedName ,如
@SerializedName("id")private String mCityId;

这样这个变量就会被替换json中为id的字段。然而有时候一个字段有两个不同的名字,如:

"cond":{"txt":"多云"}"cond":{"txt_d":"晴"}

这时候 @SerializedName 还有一个格式,这时候mTxt可以被当作txt或txt_d了,具体是谁取决于遇到谁了。

@SerializedName(value = "txt", alternate = {"txt_d"})public String mTxt;

然后就是解析了,fromJson里第一个是需要解析的json文本,String格式,后面是实体类,这样之后json里的字段就和实体类里面的变量和其他类一一对应了。

Gson gson = new Gson();CityRoot cityRoot = gson.fromJson(resultCity, CityRoot.class);

然后想怎么操作从网络上获取的资源就任我们了。


欢迎指正。

0 0