博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程数据处理_学习笔记_第七周
阅读量:4084 次
发布时间:2019-05-25

本文共 8477 字,大约阅读时间需要 28 分钟。

一、下载

1、如何请求网络数据

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mShow_textView; private Button mButton; private EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); setListeners(); } private void setListeners() { mButton.setOnClickListener(this); } private void findViews() { mEditText = (EditText) findViewById(R.id.editText); mButton = (Button) findViewById(R.id.getData_button); mShow_textView = (TextView) findViewById(R.id.show_textView); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.getData_button: //获取URL String urlString = getEditTextUrl(); //请求网络数据 String data = requestData(urlString); mShow_textView.setText(data); break; } } private String getEditTextUrl() { return mEditText !=null ? mEditText.getText().toString(): ""; } private String requestData(String urlString) { try { URL url = new URL(urlString); try { HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setRequestMethod("GET"); httpURLConnection.connect(); int responseCode = httpURLConnection.getResponseCode(); InputStream inputStream = httpURLConnection.getInputStream(); Reader reader = new InputStreamReader(inputStream,"UTF-8"); char[] buffer = new char[1024]; reader.read(buffer); String content = new String(buffer); return content; } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); Toast.makeText(this,"非法的url",Toast.LENGTH_SHORT).show(); } return null; }}

运行时报如下错误:

这里写图片描述

原因时:在主线程里进行网络请求了,应该用异步请求。

写一个内部类继承AsyncTask类,异步请求数据:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mShow_textView; private Button mButton; private EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); setListeners(); } private void setListeners() { mButton.setOnClickListener(this); } private void findViews() { mEditText = (EditText) findViewById(R.id.editText); mButton = (Button) findViewById(R.id.getData_button); mShow_textView = (TextView) findViewById(R.id.show_textView); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.getData_button: //获取URL String url = getEditTextUrl(); //请求网络数据// String data = requestData(url); new RequestNetworkDataTask().execute(url); break; } } private String getEditTextUrl() { return mEditText !=null ? mEditText.getText().toString(): ""; } private String requestData(String urlString) { try { URL url = new URL(urlString); try { HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setRequestMethod("GET"); httpURLConnection.connect(); int responseCode = httpURLConnection.getResponseCode(); InputStream inputStream = httpURLConnection.getInputStream(); Reader reader = new InputStreamReader(inputStream,"UTF-8"); char[] buffer = new char[1024]; reader.read(buffer); String content = new String(buffer); return content; } catch (IOException e) { e.printStackTrace(); //Toast.makeText(this,"读写错误",Toast.LENGTH_SHORT).show(); } } catch (MalformedURLException e) { e.printStackTrace(); //Toast.makeText(this,"非法的url",Toast.LENGTH_SHORT).show(); } return null; } //异步任务处理 class RequestNetworkDataTask extends AsyncTask
{ //在后台处理之前 @Override protected void onPreExecute() { super.onPreExecute(); //在主线程中 } @Override protected String doInBackground(String[] params) { String result = requestData(params[0]); return result; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //执行完任务后在主线程中 mShow_textView.setText(result); } }}

运行结果:

这里写图片描述

2、需要注意哪些点?

1、网络权限; —— uses-permission

2、异步请求; —— AsyncTask类
3、异步请求中不要有UI操作(要注释掉上述requestData方法里的Toast语句)

3、如何下载电影、音乐、游戏(本质都是网络请求,将流用对应的格式写进来)

4、断点下载:下载时会记录上一次下载时间等数据。

二、请求结果如何处理

1、怎样解析xml

三种解析方式:SAX、PULL、DOM。

2、常用的数据格式json

JSONObject、JSONArray

3、方便的GSON等开源库

json数据解析

raw目录下放json.txt。

这里写图片描述

在android系统里提供了json解析方案 — JSONObject类、JSONArray类等。

JSONObject类:json数据每一个大括号是一个对象,对象里是属性(键值对形式)。

JSONArray类:json数据每一个中括号是一个数组。

jsonlint.com — 格式化json数据的网站。

如何解析json数据 — 用系统的方法解析json数据

package com.example.chenjinhua.netconnect;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.InputStream;public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //读取json数据 InputStream is = getResources().openRawResource(R.raw.json); //把一个流转换成String String jsonString = getStringByInputStream(is); try { //把String类型转换成JSONObject类型 JSONObject jsonObject = new JSONObject(jsonString); //调用”get+类型“方法获取jsonObject里的user对象、id属性、array数组等。 JSONObject userJSONObject = jsonObject.getJSONObject("user"); //获取user对象里的Content属性值。 userJSONObject.getString("content"); jsonObject.getInt("id"); jsonObject.getString("title"); //jsonArray还可根据索引获取数组内容 JSONArray jsonArray = jsonObject.getJSONArray("image"); jsonArray.get(0); } catch (JSONException e) { e.printStackTrace(); } } private String getStringByInputStream(InputStream is) { return null; }}

用系统方法解析json太繁琐,可以用GSON、fastjson等开源库。

通过GSON学习,学习如何引入开源库、如何拉开源库的代码、如何引用maven库。

如何引入开源库:Project structure — app — dependencies — 点击+ — 选择library dependency — 搜索框搜索开源库名的关键字 — 点击ok。

这里写图片描述

这时gson会加到app — build.gradle的compile里,然后会自动去编译,会自动从gson的maven库子找gson的库,并拉到本地。

这里写图片描述

如何使用gson开源库?

MainActivity类

Gson gson = new Gson();        //把jsonString转换成UserInfo对象 --- 把对象和json关联起来。        UserInfo userInfo = gson.fromJson(jsonString,UserInfo.class);

UserInfo类

package com.example.chenjinhua.netconnect;import com.google.gson.annotations.SerializedName;import java.util.List;/** * Created by chenjinhua on 16/4/17. */public class UserInfo {
/* @SerializedName("title") 会自动将mTitle匹配json里的title。 */ @SerializedName("title") private String mTitle; @SerializedName("content") private String mContent; @SerializedName("user") private User mUser; /*user是内部类*/ public class User{
@SerializedName("id") private int mID; @SerializedName("name") private String mName; } /*获取数组,数组是一个List*/ @SerializedName("mImages") private List
mImages; public String getTitle() { return mTitle; } public void setTitle(String title) { mTitle = title; } public String getContent() { return mContent; } public void setContent(String content) { mContent = content; } public User getUser() { return mUser; } public void setUser(User user) { mUser = user; } public List
getImages() { return mImages; } public void setImages(List
images) { mImages = images; }}
你可能感兴趣的文章
《天空账本》团队计划
查看>>
小知识点 LINQ中延时求值和主动求值的区别
查看>>
ACF/PACF,残差白噪声的检验问题
查看>>
选择排序<C#>
查看>>
Mac 10.12安装专业抓包工具Wireshark
查看>>
CentOS 6.9配置EPEL源
查看>>
P2085 最小函数值
查看>>
阿里云直播服务 sdk demo php
查看>>
php如何判断IP为有效IP地址
查看>>
chrome浏览器的跨域设置——包括版本49前后两种设置
查看>>
admin.ModelAdmin 后台管理关联对象,某个字段怎么显示值
查看>>
解决node.js express框架的跨域问题;
查看>>
GPU
查看>>
企业管理软件开发之九 以数据绑定为基础的控件只读,创建时可写,必须大写,必须小写的原理与实现...
查看>>
第三次作业
查看>>
Python-初识python
查看>>
java基础 --jdbc操作数据库
查看>>
Latex 分块矩阵的处理
查看>>
JSP 错题
查看>>
ASP.NET Core 2.0 : 九.从Windows发布到CentOS的跨平台部署
查看>>