您的位置:首页 > 理论基础 > 计算机网络

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

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

网络连接

网络是否连接

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


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

欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 数据