Android使用OKHTTP解析JSON数据的实例代码
程序员文章站
2022-06-04 21:40:51
为了代码重用,我们首先封装一个类。这个类是httputil
httputil.java
package com.example.asus.networkte...
为了代码重用,我们首先封装一个类。这个类是httputil
httputil.java
package com.example.asus.networktest; import okhttp3.okhttpclient; import okhttp3.request; public class httputil { public static void sendokhttprequest(final string address, final okhttp3.callback callback) { okhttpclient client = new okhttpclient(); request request = new request.builder() .url(address) .build(); client.newcall(request).enqueue(callback); } }
接着老规矩,写一个实体类,里面包含get/set方法,为了方便这里命名为app.java
app.java
package com.example.asus.networktest; public class app { private string other; private string u_name; private string u_id; private string u_password; private string u_token; private string u_username; public string getother() { return other; } public void setother(string other) { this.other = other; } public string getu_name() { return u_name; } public void setu_name(string u_name) { this.u_name = u_name; } public string getu_id() { return u_id; } public void setu_id(string u_id) { this.u_id = u_id; } public string getu_password() { return u_password; } public void setu_password(string u_password) { this.u_password = u_password; } public string getu_token() { return u_token; } public void setu_token(string u_token) { this.u_token = u_token; } public string getu_username() { return u_username; } public void setu_username(string u_username) { thisu_username = u_username; } }
最后写mainactivity.java
同时为了代码的优化,和为了ui线程操作不出毛病,可以这样写。
mainactivity.java
package com.example.asus.networktest; import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.util.log; import android.view.view; import android.widget.button; import android.widget.textview; import com.google.gson.gson; import com.google.gson.reflect.typetoken; import java.io.ioexception; import java.util.list; import okhttp3.call; import okhttp3.response; public class mainactivity extends appcompatactivity implements viewonclicklistener{ string url="解析地址"; textview responsetext; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); button sendrequest = (button) findviewbyid(r.id.send_request); responsetext = (textview) findviewbyid(r.id.response_text); sendrequest.setonclicklistener(this); } @override public void onclick(view v) { //这里点击事件后,点击后调用网络请求sendrequestwithokhttp方法 if (v.getid() == r.id.send_request) { sendrequestwithokhttp(); } } private void sendrequestwithokhttp() { new thread(new runnable() { @override public void run() { //在子线程中执行http请求,并将最终的请求结果回调到okhttp3.callback中 httputil.sendokhttprequest(url,new okhttp3.callback(){ @override public void onresponse(call call, response response) throws ioexception { //得到服务器返回的具体内容 string responsedata=responsebody()string(); parsejsonwithgson(responsedata); //显示ui界面,调用的showresponse方法 showresponse(responsedata.tostring()); } @override public void onfailure(call call,ioexception e){ //在这里进行异常情况处理 } }); } }).start(); } private void parsejsonwithgson(string jsondata) { //使用轻量级的gson解析得到的json gson gson = new gson(); list<app> applist = gson.fromjson(jsondata, new typetoken<list<app>>() {}.gettype()); for (app app : applist) { //控制台输出结果,便于查看 log.d("mainactivity", "other" + app.getother()); log.d("mainactivity", "u_name" + app.getu_name()); log.d("mainactivity", "u_id" + app.getu_id()); log.d("mainactivity", "u_password" + app.getu_password()); log.d("mainactivity", "u_token" + app.getu_token()); } } private void showresponse(final string response) { //在子线程中更新ui runonuithread(new runnable() { @override public void run() { // 在这里进行ui操作,将结果显示到界面上 responsetext.settext(response); } }); } }
这样开起来是不是感觉很舒服? 这样的写法最大程度避免了android程序网络请求的阻塞影响主线程,当然,这段代码你可以直接拉过来抄下。
在java1.8中,貌似加入了lambda表达式,那么使用表达式可以干嘛呢?
最简单的就是简化书写操作,比如mainactivity.java里面的showresponse下免的开启线程的方法可以写成这个样子的:
// 这里使用java8的新特性lambda表达式开启线程 private void showresponse2(final string response) { //在子线程中更新ui runonuithread(() -> { // 在这里进行ui操作,将结果显示到界面上 responsetextsettext(response); }); }
这样的话就简单的许多了,另外点击事件也是非常适合lambda表达式的,使用表达式可以这样简化一个button的点击事件:
button button = (button)findviewbyid(r.id.bytton); button.setonclicklistener(v->{ // 处理点击事件 });
或者写成这样:
button button = (button)findviewbyid(r.id.bytton1); button.setonclicklistener((v)->{ // 处理点击事件 });
这点就先到这里啦,我也是才从java转向到android的,代码只能这样了,以后肯定还有更好的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
一个删选数据的例子,使用GROUP、DISTINCT实例解析
-
android客户端从服务器端获取json数据并解析的实现代码
-
Android 中对JSON数据解析实例代码
-
Android下拉刷新PtrFrameLayout的使用实例代码
-
在Android系统中使用gzip进行数据传递实例代码
-
python使用response.read()接收json数据的实例
-
Android使用OkHttp上传图片的实例代码
-
Android解析json数据示例代码(三种方式)
-
Android 中TeaPickerView数据级联选择器功能的实例代码
-
解析Android中string-array数据源的简单使用