版权声明:未经博主容许不得转载html
一:简介
【达叔有道】软件技术人员,时代做者,从 Android 到全栈之路,我相信你也能够!阅读他的文章,会上瘾!You and me, we are family !java
二:前言
在开发中咱们要面对很复杂的操做,那么今天的网络请求与数据解析也是对于学习Android开发者来讲,须要解决的难题,我只是讲解一下知识内容,用于理解这方面的知识点。android
三:HttpUrlConnection和JSON数据解析
网络请求有两种类型,一个是get,另外一个是post。网络请求一般使用HttpUrlConnction,HttpClient,还有更多的框架使用,这些框架也是其余人本身开发出来便于使用的。git
对于json解析,官方的原生解析和Gson解析,JSON是一种轻量级的数据交换格式,有很好的可读性和快速编写的特色。建议你能够下载一个Google插件,JSON Viewer能够便于看起来舒服点。github
看看JSON数据api: https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7web
在你的Android Studio中也提供一个插件名为:GsonFormat,GsonFormat能够帮你格式化Json数据,并自动生成相应的属性类。这个插件是否是很好,那就下载吧,若是项目巨大,你的Json数据多到你也不想打代码了吧!json
下载完Android Studio中的插件时(过程能够百度)从新启动一下就行。咱们来验证是否安装成功,找个java文件按alt+S,弹出GsonFormat的窗口则表明安装成功。api
在GsonFormat中,放入https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7(复制所有放入),点击Format便可。数组
有了GsonFormat的功能,咱们就不用辛苦生成Json数据里的属性类。缓存
四:使用json解析
JSON数据通常由服务器端提供接口,咱们根据接口地址解析数据,而后把数据显示在APP上。
举例:接口地址
多个数据 { 'students':[ {'id':'1', 'name':'peipei', 'sex':'男'}, {'id':'2', 'name':'kebin', 'sex':'男'}, {'id':'3', 'name':'hong', 'sex':'女'}, ] }
private void parseJson(String strResult){ try{ JSONArray obj = new JSONObject(strResult).getJSONArray("students"); String s=""; for(int i=0;i<obj.length();i++){ JSONObject json = (JSONObject)obj.get(i); int id = json.getInt("id"); String name=json.getString("name"); String sex=json.getString("sex"); s+="Id号:"+id+",名字:"+name+",性别:"+sex+"\n"; } }catch(JSONException e){ e.printStackTrace(); }
若是这样写个人天,也是挺累,对于使用Gson来讲就很方便啦。待会我来说使用方法。
对于Android来讲重要的网络部分,如何解决从网络上下载数据,如何解决上传,等。咱们开发app会不断向服务器发送请求,那么返回到APP的是json数据的字符串,咱们须要对json数据进行解析才能显示到app客户端上。对于HTTP协议是这样的,http为超文本传送协议,是web的基础,http是创建在tcp上的一种。http在客户端发送请求都要服务器回送响应,请求结束后,会主动释放。这个过程链接到关闭为一次链接。
五:网络权限
在咱们使用网络请求的时候,须要的是设置权限,这一点千万别忘记了。
<uses-permission android:name="android.permission.INTERNET"/>
六:使用Gson
Gson就是一个jar包,导入就行,源代码能够看看:https://github.com/google/gson 咱们只要在build.gradle的dependencies下 放入代码:
implementation 'com.google.code.gson:gson:2.2.4' //个人是导入的
咱们来使用这个接口试试:https://www.sojson.com/open/api/weather/json.shtml?city=%E5%B9%BF%E5%B7%9E 使用Gson,解析
public static WeatherBean getWeather(String res) { //建立Gson对象 Gson gson =new Gson(); //gson.fromJson(参数1,参数2); WeatherBean wetherBean = gson.fromJson(res, WeatherBean.class); //返回 return wetherBean; }
七:比较详细地说明
//HttpUrlConnection //1.实例化一个URL的对象 //2.获取HttpUrlConnection对象 //3.设置请求链接的属性 //4.获取响应码,判断是否链接成功 //5.读取输入流并解析
八:
要建立一个子线程
new Thread(){ @Override public void run(){ try{ URL url = new URL(“api地址”); HttpURLConnection coon=(HttpURLConnection)url.openConnection(); coon.setRequestMethod(“GET”); coon.setReadTimeout(6000); //获取响应码 If(coon.getResponseCode()==200){ InputStream in=coon.getInputStream(); byte[] b = new byte[1024*512]; int len=0; //创建缓存流,保存所读取的字节数组 ByteArrayOutputStream baos = new ByteArrayOutputStream(); while((len=in.read(b))>-1){ baos.write(b,0,len); } String msg = baos.toString(); Log.e(“TAG”,msg); //JSON数据的解析:1.原生解析2.gson解析 JSONObject obj = new JSONObject(msg);//捕获异常 int dui = obj.getInt("dui"); String msg2 = obj.getString("msg"); Log.e("TAG,"+dui+" "+msg2); JSONObject data = obj.getJSONObject("data"); String title = data.getString("title"); String author = data.getString("author"); String content = data.getString("content"); Log.e("TAG","标题:"+title+",做者"+author+",内容:"+content); //显示 解决问题-将操做权交还给主线程 Message message = handler.obtainMessage(); Weather e = new Weather (title,author,content); message.obj = e; //调用此方法,会触发主线程中Handler对象里覆盖了的handleMessage方法 handler.sendMessage(message); //nameView.setText(title); //authorView.setText(author); //contentView.setText(content); } }catch(MalformedURLException e){ e.printStackTrace(); }catch(IOExeption e){ e.printStackTrace(); }catch(JSONException e){ e.printStackTrace(); } } }.start();
//Hander hander = new Hander() 这个用来解决主线程和子线程进行交互的问题
//封装对象 private Hander handler = new Handler(){ @Override public void handleMessage(Message msg){ super.handleMessage(msg); //获取 Weather e = (Weather)msg.obj; nameView.setText(e.getTitle()); authorView.setText(e.getAuthor()); contentView.setText(e.getContent()); } };
//使用Gson解析上一步 //1.建立Gson对象 Gson gson = new Gson(); //参数1:知足json对象格式的字符串 String data=obj.getString("data"); Weather e = gson.fromJson(data,Weather.class);
//JSONObject jo= new JSONObject(result); //JSONArray ary = jo.getJSONArray("data"); //for(int i=0;i<ary.length();i++){ //JSONObject obj = ary.getJSONObject(i): //String a = obj.getString("name"); //} private void parseJson(String strResult){ try{ JSONArray obj = new JSONObject(strResult).getJSONArray("students"); String s=""; for(int i=0;i<obj.length();i++){ JSONObject json = (JSONObject)obj.get(i); int id = json.getInt("id"); String name=json.getString("name"); String sex=json.getString("sex"); s+="Id号:"+id+",名字:"+name+",性别:"+sex+"\n"; } }catch(JSONException e){ e.printStackTrace(); } //比较
String data=new JSONObject(result).getString("data"); //使用Gson Gson gson = new Gson(); //使用Gson,快速解析,添加jar包 //1.解析普通的json对象 //2.解析json数组 //参数1:知足json数组形式的字符串 //参数2:Type对象,泛型将会决定,你的json字符串最后被转化成的类型 ArrayList<对象> objects = gson.fromJson(data,new TypeToken<ArrayList<对象>>(){}.getType());
以上就是我的记录知识点
编辑 :达叔
定位:分享 Android&Java 知识点