• Android使用OKHTTP解析JSON数据


    为了代码重用,我们首先封装一个类。这个类是HttpUtil

    HttpUtil.java

    1. package com.example.asus.networktest;
    2.  
    3. import okhttp3.OkHttpClient;
    4. import okhttp3.Request;
    5.  
    6. public class HttpUtil {
    7.  
    8.     public static void sendOkHttpRequest(final String address, final okhttp3.Callback callback) {
    9.         OkHttpClient client = new OkHttpClient();
    10.         Request request = new Request.Builder()
    11.                 .url(address)
    12.                 .build();
    13.         client.newCall(request).enqueue(callback);
    14.     }
    15.  
    16. }

    接着老规矩,写一个实体类,里面包含get/set方法,为了方便这里命名为App.java

    App.java

    1. package com.example.asus.networktest;
    2.  
    3. public class App {
    4.  
    5.     private String other;
    6.  
    7.     private String u_Name;
    8.  
    9.     private String u_id;
    10.  
    11.     private String u_passWord;
    12.  
    13.     private String u_token;
    14.  
    15.     private String u_userName;
    16.  
    17.     public String getOther() {
    18.         return other;
    19.     }
    20.  
    21.     public void setOther(String other) {
    22.         this.other = other;
    23.     }
    24.  
    25.     public String getU_Name() {
    26.         return u_Name;
    27.     }
    28.  
    29.     public void setU_Name(String u_Name) {
    30.         this.u_Name = u_Name;
    31.     }
    32.  
    33.     public String getU_id() {
    34.         return u_id;
    35.     }
    36.  
    37.     public void setU_id(String u_id) {
    38.         this.u_id = u_id;
    39.     }
    40.  
    41.     public String getU_passWord() {
    42.         return u_passWord;
    43.     }
    44.  
    45.     public void setU_passWord(String u_passWord) {
    46.         this.u_passWord = u_passWord;
    47.     }
    48.  
    49.     public String getU_token() {
    50.         return u_token;
    51.     }
    52.  
    53.     public void setU_token(String u_token) {
    54.         this.u_token = u_token;
    55.     }
    56.  
    57.     public String getU_userName() {
    58.         return u_userName;
    59.     }
    60.  
    61.     public void setU_userName(String u_userName) {
    62.         this.u_userName = u_userName;
    63.     }
    64. }

    最后写MainActivity.java

    同时为了代码的优化,和为了UI线程操作不出毛病,可以这样写。

    MainActivity.java

    1. package com.example.asus.networktest;
    2.  
    3. import android.os.Bundle;
    4. import android.support.v7.app.AppCompatActivity;
    5. import android.util.Log;
    6. import android.view.View;
    7. import android.widget.Button;
    8. import android.widget.TextView;
    9.  
    10. import com.google.gson.Gson;
    11. import com.google.gson.reflect.TypeToken;
    12.  
    13. import java.io.IOException;
    14. import java.util.List;
    15.  
    16. import okhttp3.Call;
    17. import okhttp3.Response;
    18.  
    19. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    20.  
    21.     String url="解析地址";
    22.     TextView responseText;
    23.  
    24.     @Override
    25.     protected void onCreate(Bundle savedInstanceState) {
    26.         super.onCreate(savedInstanceState);
    27.         setContentView(R.layout.activity_main);
    28.         Button sendRequest = (Button) findViewById(R.id.send_request);
    29.         responseText = (TextView) findViewById(R.id.response_text);
    30.         sendRequest.setOnClickListener(this);
    31.     }
    32.  
    33.     @Override
    34.     public void onClick(View v) {
    35.         //这里点击事件后,点击后调用网络请求sendRequestWithOkHttp方法
    36.         if (v.getId() == R.id.send_request) {
    37.             sendRequestWithOkHttp();
    38.         }
    39.     }
    40.  
    41.     private void sendRequestWithOkHttp() {
    42.         new Thread(new Runnable() {
    43.             @Override
    44.             public void run() {
    45.                 //在子线程中执行Http请求,并将最终的请求结果回调到okhttp3.Callback中
    46.                 HttpUtil.sendOkHttpRequest(url,new okhttp3.Callback(){
    47.                     @Override
    48.                     public void onResponse(Call call, Response response) throws IOException {
    49.                         //得到服务器返回的具体内容
    50.                         String responseData=response.body().string();
    51.                         parseJSONWithGSON(responseData);
    52.                         //显示UI界面,调用的showResponse方法
    53.                         showResponse(responseData.toString());
    54.                     }
    55.                     @Override
    56.                     public void onFailure(Call call,IOException e){
    57.                         //在这里进行异常情况处理
    58.                     }
    59.                 });
    60.             }
    61.         }).start();
    62.     }
    63.  
    64.     private void parseJSONWithGSON(String jsonData) {
    65.         //使用轻量级的Gson解析得到的json
    66.         Gson gson = new Gson();
    67.         List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType());
    68.         for (App app : appList) {
    69.             //控制台输出结果,便于查看
    70.             Log.d("MainActivity", "other" + app.getOther());
    71.             Log.d("MainActivity", "u_Name" + app.getU_Name());
    72.             Log.d("MainActivity", "u_id" + app.getU_id());
    73.             Log.d("MainActivity", "u_passWord" + app.getU_passWord());
    74.             Log.d("MainActivity", "u_token" + app.getU_token());
    75.         }
    76.     }
    77.     private void showResponse(final String response) {
    78.         //在子线程中更新UI
    79.         runOnUiThread(new Runnable() {
    80.             @Override
    81.             public void run() {
    82.                 // 在这里进行UI操作,将结果显示到界面上
    83.                 responseText.setText(response);
    84.             }
    85.         });
    86.     }
    87. }

    这样开起来是不是感觉很舒服?  这样的写法最大程度避免了Android程序网络请求的阻塞影响主线程,当然,这段代码你可以直接拉过来抄下。

    在Java1.8中,貌似加入了Lambda表达式,那么使用表达式可以干嘛呢?

    最简单的就是简化书写操作,比如MainActivity.java里面的showResponse下免的开启线程的方法可以写成这个样子的:

    1. // 这里使用Java8的新特性Lambda表达式开启线程
    2.     private void showResponse2(final String response) {
    3.         //在子线程中更新UI
    4.         runOnUiThread(() -> {
    5.                 // 在这里进行UI操作,将结果显示到界面上
    6.                 responseText.setText(response);
    7.         });
    8.     }

    这样的话就简单的许多了,另外点击事件也是非常适合Lambda表达式的,使用表达式可以这样简化一个button的点击事件:

    1. Button button = (Button)findViewById(R.id.bytton1);
    2. button.setOnClickListener(v->{
    3.     // 处理点击事件
    4. });

    或者写成这样:

    1. Button button = (Button)findViewById(R.id.bytton1);
    2. button.setOnClickListener((v)->{
    3.     // 处理点击事件
    4. });

     

    这点就先到这里啦,我也是才从Java转向到Android的,代码只能这样了,以后肯定还有更好的。

  • 相关阅读:
    POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)
    文本编辑器vim和gedit
    Ubuntu安装tensorflow
    剑指offer——python【第29题】最小的K个数
    剑指offer——python【第30题】连续子数组的最大和
    剑指offer——python【第37题】数字在排序数组中出现的次数
    剑指offer——python【第28题】数组 中出现次数超过一半的数字
    剑指offer——python【第31题】整数1出现的次数
    剑指offer——python【第54题】字符流中第一个不重复的字符
    剑指offer——python【第40题】数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/ceet/p/7101489.html
Copyright © 2020-2023  润新知