热门标签 | 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;
 }

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


推荐阅读
  • 探讨低代码行业发展现状,分析其未能催生大型企业的原因,包括市场需求、技术局限及商业模型等方面。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 在使用 Python 编程时,如果在一个函数中引用了未声明为全局变量的外部变量,可能会遇到 UnboundLocalError。本文将通过一个具体的例子来解释如何解决这个问题。 ... [详细]
  • 2023年最新Linux环境下Android开发环境搭建指南
    2023年最新Linux环境下Android开发环境搭建指南,帮助Android开发者在Linux系统上快速搭建开发环境,解决常见的配置问题。 ... [详细]
  • 本文作者是一位普通二本学校的毕业生,尽管学校背景不如211、985高校,但他通过自身的努力学习数据结构、组成原理和操作系统等课程,认为自己的能力并不逊色于名牌大学的毕业生。文章详细描述了他在不同城市求职的经历以及对自身能力和未来发展的看法。 ... [详细]
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • web页面报表js下载,web报表软件 ... [详细]
  • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 本文详细介绍了 Android 开发中常用的单位 dip(设备独立像素)、px(像素)、pt(点)和 sp(可缩放像素),并解释了它们在不同屏幕密度下的应用。 ... [详细]
  • 本文探讨了 Java 中 Unsafe.park 和 Object.wait 方法的区别,分析了它们的性能和适用场景,并提供了专业建议。 ... [详细]
  • 本文介绍了 JSON Schema 和 XML Schema 的基本概念,并详细讲解了如何使用 AJV 进行 JSON 数据校验。通过具体的示例和扩展方法,帮助读者更好地理解和应用这些工具。 ... [详细]
  • 年前,我发表了一篇文章,分享了自己通过在线教育平台学习IT技能的经历。文中详细探讨了在线教育与传统线下教育在技能培训方面的优缺点。许多网友在讨论在线教育时,常常提到“在线教育是否缺乏学习氛围”的问题。本文将对此进行深入分析。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
author-avatar
筷子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有