根据上一篇写的是实现了通过url接口将接口中的数据显示出来,这次根据上一篇的基础,进一步说明一下AsynTask的使用。

AsynTask类有几个函数是大家必须知道的。

  doInBackGround()

  onPreExecute()

  onPostExecute()

  onProgressUpdate()

  首先doInBackGround():必须的一个复写的方法,在doInBackGround()中主要是写的一些后天的耗时的操作,比如数据库的连接和对于服务器接口的获取。

  onPreExecute():可以写一些的提示语,他是在主线程中运行的。

  onPostExecute():执行doInBackGround()中的返回结果。

  onProgressUpdate():无返回值

   AsynTask类的三个参数的讲解,首先第一个参数是在主类中调用excute()方法的时候传递的参数。如果不需要参数的传递则将其设置为Void类型。

  第二个参数为子线程中的执行过程,它的类型和onProgressUpdate()中的类型一致。

  第三个参数为返回值的类型,和doInBackground()方法的返回值类型还有onPostExecute()中的一致。

  为了测试这个软件,我在上次的基础上加了一个按钮,点击按钮的时候就会返回Json数据, 并且还有进度的显示

  效果图如下:

 开始:

点击获取Json数据

进度条的显示我是在logcat中显示的,你也可以让其在手机上显示

这次的代码比上次有点改变,不过变化不大,我这里就只给大家贴出MainActivity和HttpData这两个类,至于接口就在上篇博文http://www.cnblogs.com/bingbingliang-xiaomonv/p/5247223.html中看吧

MainActivity中有关的解释我都写在了代码注释中,代码如下

 package com.example.httpdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity implements HttpDataUrlListener,OnClickListener{ private HttpData httpdata;
private TextView tx;
private Button butn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx = (TextView)findViewById(R.id.txt);
butn = (Button)findViewById(R.id.btn);
//这个this自动识别OnClickListener接口
butn.setOnClickListener(this); } @Override
public void GetDataUrl(String data) {
// TODO Auto-generated method stub
System.out.println(data);
tx.setText(data);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn:
//这个this自动识别HttpDataUrlListener接口
httpdata = (HttpData) new HttpData("http://www.tuling123.com/openapi/api"
+ "?key=66530329be6f0110bcfb8dc06a4ddfff&info=今天天气怎么样"
+ "&loc=北京市中关村&userid=12345678",this
).execute();
break; default:
break;
}
} }

HttpData()中的代码如下:

 package com.example.httpdemo;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient; import android.os.AsyncTask;
import android.widget.Toast; public class HttpData extends AsyncTask<String, Float, String>{ //1.创建客户端
private HttpClient mhttpclient;
//2。指明传递的方法
private HttpGet mhttpget;
//3.做出回应
private HttpResponse mhttpresponse;
//4.创建实体
private HttpEntity mhttpentity;
//5.使用数据流进行数据的传输
private InputStream in;
//6.创建缓冲区
private BufferedReader br;
//7.储存所有的数据
private StringBuffer sb; //声明接口
private HttpDataUrlListener listener; private String url; public HttpData(){
}
public HttpData(String url){
this.url = url;
}
public HttpData(String url,HttpDataUrlListener listener){
this.url = url;
this.listener = listener;
} @Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub try {
//实例化一个客户端
mhttpclient = new DefaultHttpClient();
//使用get方法进行传递
mhttpget = new HttpGet(url);
//通过客户端进行发送
mhttpresponse = mhttpclient.execute(mhttpget);
//通过response方法获取实体
mhttpentity = mhttpresponse.getEntity();
long total = mhttpentity.getContentLength();
//通过流获取具体的内容
in = mhttpentity.getContent();
//创建缓冲区
br = new BufferedReader(new InputStreamReader(in));
String line = null;
sb = new StringBuffer();
while ((line = br.readLine())!=null){
sb.append(line);
//用于显示进度
publishProgress((float)sb.toString().length()/total);
} return sb.toString();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} @Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
//这里是获取结果,将结果传给了接口,然后使用接口进行传递
//result也是AsyncTask中的最后一个参数
listener.GetDataUrl(result);
super.onPostExecute(result);
} @Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// System.out.println("PreExecute");
} @Override
protected void onProgressUpdate(Float... values) {
// TODO Auto-generated method stub
System.out.println(values[0]);
super.onProgressUpdate(values);
} }

好了,上述就是我对于 AsynTask类的一些比较基本的理解,希望能够对于你们有帮助,有什么欠缺的地方,还望大家留言。

Android之HTTP网络通信--GET传递(二)的更多相关文章

  1. Android之HTTP网络通信--GET传递

    说明 在做一个项目的时候难免会与服务器打交道,这里我就做一个小的Demo来简单的说明一下HTTP的使用,我这里使用的是图灵的接口,你也可以登陆www.tuling123.com进行申请.我使用的是上面 ...

  2. Android消息传递之组件间传递消息

    前言: 上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信.本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要 ...

  3. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  4. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  5. 使用HttpURLConnection实现在android客户端和服务器之间传递对象

    一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml ...

  6. Android系统--输入系统(十二)Dispatch线程_总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

  7. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  8. Android BLE与终端通信(二)——Android Bluetooth基础科普以及搜索蓝牙设备显示列表

    Android BLE与终端通信(二)--Android Bluetooth基础搜索蓝牙设备显示列表 摘要 第一篇算是个热身,这一片开始来写些硬菜了,这篇就是实际和蓝牙打交道了,所以要用到真机调试哟, ...

  9. 【Android Studio安装部署系列】二十、Android studio如何将so文件添加到svn中

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在使用android studio的过程中,常常会遇到一个头疼的问题,添加的so,居然无法被svn添加. 选项都是灰的: 那这种问题 ...

随机推荐

  1. java jvm学习笔记四(安全管理器)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一 ...

  2. bzoj 2816: [ZJOI2012]网络(splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2816 [题意] 给定一个无向图,满足条件:从一个节点出发的同色边不超过2条,且不存在同 ...

  3. “Clean Code” 读书笔记序

    最近开始研读 Robert C.Martin 的 “Clean Code”,为了巩固学习,会把每一章的笔记整理到博客中.而这篇博文作为一个索引和总结,会陆续加入各章的笔记链接,以及全部读完后的心得体会 ...

  4. flappy pig小游戏源码分析(2)——解剖option

    今天继续分析flappy bird的源码.重温一下源码的目录结构. 在本系列第一篇中我们分析了game.js文件,也就是整个程序的架构.这一篇我们来看看option.js文件,这个文件的内容很简单,主 ...

  5. 【poj2478】Farey Sequence

    题意: 求前n项的欧拉函数之和 题解: 预处理出所有欧拉函数 赤裸裸的模版题- - 没什么好说的 代码: #include <cstdio> typedef long long ll; ; ...

  6. ffmpeg ffprobe ffplay

    ./ffprobe -print_format json -show_format -show_frames -select_streams v -i ../hhh.flv ./ffprobe -pr ...

  7. ACCESS-字符函数

    mid:等于delphi中的COPY举例str="123456"mid(str,2,1)的意思是在str字符串中从第2个字符开始取得一个字符,结果为2注意:下标是从1开始,而不是从 ...

  8. 用UGN3503霍尔器件制作的数字指南针_电路图

    本文介绍了用两个UGN3503型霍尔器件设计制作的数字指南针的设计目的.系统结构和工作原理,以及各主要器件的使用方法.本系统包括UGN3503型霍尔器件.TLC0832 A/D转换器.单片机控制.液晶 ...

  9. [iOS基础控件 - 6.7.1] 微博展示 代码

      Controller: // // ViewController.m // Weibo // // Created by hellovoidworld on 14/12/4. // Copyrig ...

  10. CALayer精讲

    前言 CALayer包含在QuartzCore框架中,这是一个跨平台的框架,既可以用在iOS中又可以用在Mac OS X中.后面要学Core Animation就应该先学好Layer(层). 我们看一 ...