利用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. 迎娶了校花的学霸,竟把日子过成了这个样子!
  2. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
  3. json java 实例_java JSON数据转对象
  4. RunTime类,后台快速打开浏览器
  5. 闭包/Block当成函数参数实现回调
  6. sdut 2074 区间覆盖问题(贪心)
  7. css x轴不滚动_泡沫轴滚动放松是什么原理:你并不了解泡沫轴
  8. 算法(八):图解KNN算法
  9. MyBatis----resultMap的使用
  10. 转载explicit关键字
  11. ubuntu14.04 的网络配置
  12. MSN QQ网页聊天代码
  13. android 模拟器 锁屏,如何在模拟器中测试Android锁屏小部件?
  14. 【JavaWeb】最详细的小白笔记!!!
  15. 计算机应用新媒体是什么,新媒体概念,什么是新媒体
  16. c语言中begin用法,C++ deque cbegin()用法及代码示例
  17. sql语句的增删改操作附加代码
  18. 路由追踪traceroute分析
  19. 开篇 | 想成为技术牛人?先搞定网络协议!
  20. 如何开发一款前端工具

热门文章

  1. MyBatis 插件原理与自定义插件-PageHelper 原理
  2. 利用模板模式重构JDBC操作
  3. Redis中的set 集合
  4. Spring框架功能整体介绍
  5. 数据库-优化-mysql慢查日志分析工具-mysqldumpslow介绍及用法
  6. POI的入门:单元格样式处理
  7. 负载均衡器 Ribbion
  8. 单例设计模式-反射攻击解决方案及原理分析
  9. Zookeeper_安全认证讲解
  10. spring-DAO