android AsynTask处理返回数据和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<T> extends AsyncTask<String,Void,T> {
private OnResponseListener<T> listener;
public void setListener(OnResponseListener<T> 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<T>{
void onResponse(T t);
}
}
//获取数据的测试类
public class Test {
//要获取的user对象
private User user1=null;
public void get(){
//创建网络访问实例
Http<User> http=new Http<User>();
//重写接口
http.setListener(new Http.OnResponseListener<User>() {
@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 AsynTask处理返回数据和AsynTask使用get,post请求的更多相关文章
- Requests方法 -- 参数关联与JSESSION(上一个接口的返回数据作为下一个接口的请求参数)
前言 参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了.最常见的案例就是网站的登录案例,很多网站的登录并不仅仅 ...
- python3乱码问题:接口返回数据中文乱码问题解决
昨天测试接口出现有一个接口中文乱码问题,现象: 1 浏览器请求返回显示正常 2 用代码请求接口返回数据中文显示乱码 3 使用的python3,python3默认unicode编码,中文都是可以正常显示 ...
- android 学习随笔十五(Activity的生命周期与摧毁时返回数据 )
1.Activity的生命周期 onCreate:创建时调用 onStart:在屏幕上可见,但是还没有获得焦点 onResume:可见并且获得焦点 onPause:可见,但是失去焦点 onStop:不 ...
- Android开发:向下一个activity传递数据,返回数据给上一个activity
1.向下一个activity传递数据 activity1 Button button=(Button) findViewById(R.id.button1); button.setOnClickLis ...
- Android基础之——startActivityForResult启动界面并返回数据,上传头像
在android应用的开发过程中,常常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在非常多应用程序的模块中,都有"我的"这个模块,在未登录 ...
- 如何解析android访问webservice返回的SoapObject数据(可用)
怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...
- Android调用 .Net Core WebApi 返回数据,用FastJSON解析一直报错。
问题描述:.Net Core WebApi中用Newtonsoft.Json 把datatable转成json字符串,如:JsonConvert.SerializeObject(table,Forma ...
- 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动
1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...
- 【Android 复习】:从Activity中返回数据
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递类似,也可以采用上一讲中的四种方式来传递数据,但是一般建议采用Intent对象的方式的来返 ...
随机推荐
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 支付宝web支付
过程 1. 用户下单 2. 商户后台产生订单 3. 请求支付宝web支付页面(将订单信息返回给用户---放在form里面---隐藏起来-----并通过脚本自动提交此form到支付宝web支付页) 4. ...
- 机器指令翻译成 JavaScript —— 终极目标
上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来 ...
- .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序
在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 m ...
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...
- Asp.Net 5 新增公告仓库
一直以来Asp.Net 5 都没有一个比较统一的公告页,对于一个在日夜更新的项目来说,很多人经常会遇到问题但是不知道去哪里寻找帮助,现在Asp.Net 5 项目组新增了一个公告仓库来解决这个问题. ...
- 程序猿是如何解决SQLServer占CPU100%的
文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句会导致CPU过高? 查看SQL的查询计划 ...
- C++ std::forward_list
std::forward_list template < class T, class Alloc = allocator > class forward_list; Forward li ...
- highlight.js 代码高亮插件
官网:https://highlightjs.org/ API:http://highlightjs.readthedocs.org/en/latest/api.html 1. 简单使用: <l ...
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...