欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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的,代码只能这样了,以后肯定还有更好的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。