热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

androidAsynTask处理返回数据和AsynTask使用get,post请求

本文主要介绍了androidAsynTask处理返回数据和AsynTask使用get,post请求方法。具有一定的参考价值,下面跟着小编一起来看下吧

Android是一个单线程模型,Android界面(UI)的绘制都只能在主线程中进行,如果在主线程中进行耗时的操作,就会影响UI的绘制和事件的响应。所以在android规定,不可在主线中进行耗时操作,否则将发生程序无响应(ANR)问题。

解决办法:开启新的线程进行耗时操作

开启新的线程可以new Thread() 或实现Runnable接口

什么要使用AsyncTask呢?

如果是使用Thread的run()方法,run()结束之后没有返回值。所以必须要自己建立通信机制

AsyncTask将所有的线程通信都封装成回调函数,调用逻辑容易书写。尤其是在异步处理结束之后,有回调函数进行收尾处理。咳咳,程序员都懒的么

Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask   当然是那个简单就用那个咯

最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报:android.os.NetworkOnMainThreadException

什么是AsyncTask(原谅宝宝偷的图   嘿嘿  不过真的解释的很清楚呢)

注意:

 Task的实例必须在UI Thread中创建

 execute方法不惜在UI thread中创建

 task只能被执行一次 多次调用时会出现异常

通用AsyncTask 以及在主线程中使用网络请求回返的数据

   通用AsyncTask是什么意思呢 发送不同的请求返回不同类型的数据 难道要一个类型写个AsyncTask 岂不是麻烦死咯

   还有一种情况  我们通过异步任务得到了一个对象然后在一下行立刻使用这个对象逻辑完全没问题但是运行之后会报空指针异常。这是怎么回事呢?       

   AsycnTask开始了一个新的线程,但是主线程并没有停止还在继续运行,马上就使用这个对象,而你新开的线程可能正在访问网络这个对象为空

   你无法确定AsycnTask什么时候才能获取到数据,网快嗖的一下就好了,网慢就要等好久。

看一个简略的小例子

首先呢  我们使用异步任务的时候要处理不同类型的数据把这个Http设置泛型类第三个参数返回值类型设置为泛型不管你是什么类型的数据全部ok

我又写了一个接口作为Http的属性  在onPostExecute方法调用其中的onResponse方法在Test中实现接口

这个接口的作用完全可以理解为一个监听事件 checkbox的改变监听触发条件是 是否选中这个接口监听是否有数据  完成网络访问有数据的时候就调用

我们在主线程中完成接口的实现已经在主线程中实现了返回来的数据还不是任君宰割阿~~~~~

 public class Http extends AsyncTask {
 private OnResponseListener listener;
 public void setListener(OnResponseListener listener) {
 this.listener = listener;
 }
 @Override
 protected T doInBackground(String... params) {
 return null;
 }
 @Override
 protected void onPostExecute(T t) {
 super.onPostExecute(t);
 if (listener!=null){
  listener.onResponse(t);
 }
 }
 //接口 类似一个监听事件
 public interface OnResponseListener{
 void onResponse(T t);
 }
}
//获取数据的测试类
public class Test {
 //要获取的user对象
 private User user1=null;
 public void get(){
 //创建网络访问实例
 Http http=new Http();
 //重写接口
 http.setListener(new Http.OnResponseListener() {
  @Override
  public void onResponse(User user) {
  user1=user;
  }
 });
 http.execute("xxx.balabala.com");
 }
}

在发送请求的时候很容易就带个参数,请求的方式呢 无非就是get,post 两者的区别呢大白话的说get不安全参数通过url直接传过去post安全参数加密一下子

下面贴一下AsyncTask在get和post请求时核心代码doInBackground方法

GET

protected T doInBackground(String... params) {
 //网络连接对象
 HttpURLConnection cOnnection=null;
 //输入流 获取网络数据
 InputStream is=null;
 //字节数组输出流
 ByteArrayOutputStream bos=null;
 try {
  //获取网络连接对象
  cOnnection=(HttpURLConnection) new URL(params[0]).openConnection();
  //设置get请求 必须大写
  connection.setRequestMethod("GET");
  //获取网络请求码 200 400 500之类 不懂百度
  int code=connection.getResponseCode();
  if(code==200){
  //获取流
  is=connection.getInputStream();
  //临时字节数组
  byte [] b=new byte[1024];
  int len=-1;
  bos=new ByteArrayOutputStream();
  while ((len=is.read(b))!=-1){
   //写入数据
   bos.write(b,0,len);
  }
  String json=bos.toString("utf-8");
  T t=JSON.parseObject(json,type);
  return t;
  }else{
  Log.e("error","网络访问失败==========="+code);
  }
 } catch (IOException e) {
  e.printStackTrace();
 }finally {
  try {
  if (bos!=null){
   bos.close();
  }
  if (is!=null){
   is.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  if (connection!=null){
  connection.disconnect();
  }
 }
 return null;
 }

POST

post和get的区别  就是post多了一段处理参数的代码

protected T doInBackground(String... params) {
 //分割url 分为地址和参数两部分
 String[] strArr=params[0].split("\\?");
 HttpURLConnection cOnnection=null;
 //输出流
 OutputStream os=null;
 //输入流
 InputStream is=null;
 ByteArrayOutputStream bos=null;
 try {
  cOnnection=(HttpURLConnection) new URL(strArr[0]).openConnection();
  connection.setRequestMethod("POST");
  //设置允许输入 输出 默认值true 不写也可以
  connection.setDoOutput(true);
  connection.setDoInput(true);
  os=connection.getOutputStream();
  //把参数写入
  os.write(strArr[1].getBytes("utf-8"));
  os.close();
  int code=connection.getResponseCode();
  if(code==200){
  is=connection.getInputStream();
  byte [] b=new byte[1024];
  int len=-1;
  bos=new ByteArrayOutputStream();
  while ((len=is.read(b))!=-1){
   bos.write(b,0,len);
  }
  String json=bos.toString("utf-8");
  T t=JSON.parseObject(json,type);
  return t;
  }else{
  Log.e("error","网络访问失败==========="+code);
  }
 } catch (IOException e) {
  e.printStackTrace();
 }finally {
  try {
  if (bos!=null){
   bos.close();
  }
  if (is!=null){
   is.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  if (connection!=null){
  connection.disconnect();
  }
 }
 return null;
 }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
花逝留香人走荼茶凉_442
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有