利用AsyncTask和OkHttp进行API数据请求

  • 背景

    • 从安卓3.0开始,不允许在主线程和UI线程中进行网络请求,因为可能会造成线程堵塞。
    • 因此,只能在子线程进行网络请求,出现了很多请求的方法,例如开启子线程利用Message传递数据,或者OkHttp封装了异步请求,会开启新线程进行网络请求。
    • 本案例使用OkHttp(主要因为方便使用,比起HttpConnection和HttpClient效率不遑多让,甚至仍有胜之)进行网络请求,但是使用同步请求(不会开启新的线程,因此会崩溃)。
    • 本案例,处理网络请求的方式为异步加载处理,利用AsyncTask开启一个异步任务,任务返回结果并进行处理操作。
  • 配置
    • 添加okhttp和gson的依赖

      • implementation 'com.squareup.okhttp3:okhttp:3.10.0'
      • implementation 'com.google.code.gson:gson:2.8.2'
  • 介绍
    • 一般,将任务封装为一个类并继承AsyncTask<Params, Progress,Result>。继承AsyncTask需要指定三个泛型参数。

      • Params:启动任务时输入参数的类型,我这里传入了一个URL路径。
      • Progress:后台任务执行中返回进度值的类型,可以用来显示进度。
      • Result:后台任务完成后返回结果的类型,我这里是一个自定义的Item。
    • 如果你用的IDE是比较智能的如Android Studio,那么会提示实现相应的方法,其中doInBackGround是必须实现的,也是唯一一个子线程的方法。
      • doInBackGround:必须重写,子线程在这个方法里面进行耗时操作。(这个方法的进行在子线程中)
      • onPreExecute:执行后台耗时操作前被调用,通常在方法里面进行一些初始化的操作。
      • onPostExecute:当doInBackground完成后,系统会自动调用这个方法,并且将doInBackground方法返回的值传给该方法。
      • onProgressUpdate:在doInBackground方法中调用publishProgress方法时,更新任务的执行进度后,会触发这个方法。
  • 实战使用
    • 首先需要在manifest文件中添加网络权限。
    • 使用OkHttp+AsyncTask发送网络请求并使用Gson解析API数据,渲染到界面的一个TextView上。
    • 简单编写一个只含有name属性的Bean类。
    • 编写Task类,继承自AsyncTask并在后台使用OkHttp进行网络请求。请求的是自己编写的一个API网站(API的WEB服务搭建这里不做叙述,请求得到的是json格式数据。)。
      • 请求的数据结构

      •   package com.zc.testforasynctask;import android.content.Context;import android.os.AsyncTask;import android.util.Log;import android.widget.TextView;import android.widget.Toast;import com.google.gson.Gson;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MyTask extends AsyncTask<String, String, Item> {private Context mContext;private TextView tv;public MyTask(Context mContext, TextView tv) {this.mContext = mContext;this.tv = tv;}@Overrideprotected void onPreExecute() {super.onPreExecute();Toast.makeText(mContext, "开始寻找网络资源", Toast.LENGTH_SHORT).show();}private String baseUrl = "http://13.250.1.159:8000/api/";@Overrideprotected Item doInBackground(String... strings) {Item result;try {Thread.sleep(0b1111101000);OkHttpClient client = new OkHttpClient();String nowUrl = baseUrl + "merchants/" + strings[0] + ".json";Request request = new Request.Builder().url(nowUrl).build();Response response = client.newCall(request).execute();if (response.isSuccessful()){result = parseItemJsonObject(response.body().string());Log.i("msg", result.getName());}else {Toast.makeText(mContext, "无结果", Toast.LENGTH_SHORT).show();return null;}}catch (Exception e){Toast.makeText(mContext, "网络连接异常", Toast.LENGTH_SHORT).show();return null;}return result;}@Overrideprotected void onPostExecute(Item item) {super.onPostExecute(item);if(item != null){tv.setText(item.getName());}else {tv.setText("数据解析为空");}}private  Item parseItemJsonObject(String jsonData) {// 解析Json对象try {if (jsonData != null) {//创建一个Gson对象Gson gson = new Gson();Item item = gson.fromJson(jsonData,Item.class);return item;}else {return null;}}catch (Exception e){e.printStackTrace();return null;}}}
    • 主活动进行事件绑定和点击事件注册
      • 代码见GitHub
  • 效果展示
  • 补充说明
    • 具体代码和环境配置见我的GitHub,欢迎star或者fork
    • 欢迎指出优化之处

安卓进阶系列-08异步加载AsynsTask使用相关推荐

  1. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...

    AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...

  2. android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...

    http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...

  3. Flutter进阶—网络与本地异步加载资源

    通过网络加载JSON文件的实例 import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/ ...

  4. Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...

  5. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

  6. vue进阶测试——生命周期和异步加载的微妙关系

    本文继续探索vue中的坑,关于vue的生命周期和异步加载相关处理的文章还比较少,可能是自己没有用谷歌而用百度的缘故吧.关于异步操作和生命周期,会牵扯到浏览器的单线程处理机制,以及ES中的promise ...

  7. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...

  8. android多种方式实现异步加载图片

    记得之前做安卓应用时都是在2.2以下的版本,如果在UI线程中进行耗时操作,比如http,socket等 会产生android.os.NetworkOnMainThreadException 如果异步加 ...

  9. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

最新文章

  1. pandas(四) -- 数值计算
  2. java交换integer_Java比较和交换语义和性能
  3. 执行h2o的python命令时出现:TypeError: ‘NoneType‘ object is not callable
  4. Java 数据类型和 MySql 数据类型对应一览表
  5. 7.11计划,做个没心没肺的人
  6. QuickPart : 用户控件包装器 for Office SharePoint Server 2007
  7. Framehawk技术-思杰HDX
  8. 基于UNITY引擎开发的游戏源码修改方法
  9. 《用户故事地图》摘录
  10. 上班[卒]如何面对复杂工作?
  11. 一起学JAVA 学习路径 知识体系
  12. 二、C++反作弊对抗实战 (进阶篇 —— 4.遍历进程模块(暴力扫描整个内存找出被断链的))
  13. 绵阳师范学院2021计算机考试,绵阳师范计算机学院2021年招生计划
  14. 关于simplis仿真和驱动方法
  15. Java(回文数--一种比较简单的写法)
  16. 认识V模型,W模型,H模型三类模型
  17. 2021 河北取证比武决赛个人赛 题解 入侵溯源
  18. 听觉外围分析matlab,扫描附近的低功耗 Bluetooth 外围设备 - MATLAB blelist - MathWorks 中国...
  19. 如何提高自己的知识水平?
  20. UE4 动画系统 源码及原理剖析

热门文章

  1. ConcurrentHashMap的源码分析-为什么要做高低位的划分
  2. AQS.accquire
  3. 缓冲流的效率测试_复制文件
  4. POI的入门:单元格样式处理
  5. 摆放家具-定义房子类
  6. 高级concurrent包
  7. 学计算机是什么猿,卡内基梅隆大学生物计算机专业 让你快快乐乐的当一个程序猿...
  8. Spring--IoC(2)
  9. kafka不使用自带zk_Kafka监控必备——Kafka-Eagle 2.0.2正式发布
  10. 常用软件滤波算法---摘自:FeoTech