AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。

AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。

* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
* onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。

使用方法:

1.在主线程中调用task.execute(is);方法。参数个数是可变的,可以传0个,1个,2个或者更多,当调用这个函数系统就会自动去调用doInBackgound()函数。

2.extends AsyncTask<X, Y, Z>参数类型,其中X为doInBackground(X)的参数类型,也同样为execute(X)的参数类型。 Y为onProgressUpdate(Y)的参数类型。 Z为 onPostExecute(Z)的参数类型。

3.doInBackground在后台,onProgressUpdate在前台。通过publishProgress(Y)传递后台数据到前台。

举例函数:

package com.android.weather.parse;import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.util.Log;import com.android.weather.db.Weathers;public class ReadWeatherDataInternet {private static final String TAG = "ReadWeatherDataInternet";private static URL cityUrl = null;private static String cityStr = "Beijing";private Context mContext;private HttpResponed mHttpResponed;public ReadWeatherDataInternet(Context c) {mContext = c;}public void SetHttpConnectListener(HttpResponed responed){mHttpResponed = responed;}public void ParseURL(String city){ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkinfo = connectivityManager.getActiveNetworkInfo();        if (networkinfo==null) {Log.d("Controller", "no active network");mHttpResponed.respond(null,city,false);return;}cityStr = city;InputStream is = readWeatherDataFromInternet();if(is != null){ParseTask task = new ParseTask();  task.execute(is);  //参数个数是可变的,可以传0个,1个,2个或者更多,当调用这个函数系统就会自动去调用doInBackgound()函数}}class ParseTask extends AsyncTask<InputStream ,CurrentEntity, String> {//这三个参数对应的是excute(String),//onProgressUpdate(Integer),onPostResult(string)这三个方法里面的参数类型  // 可变长的输入参数,与AsyncTask.exucute()对应  @Override  protected void onProgressUpdate(CurrentEntity... entity) {  //这个参数是接受publishProgress(Integer)的参数的mHttpResponed.respond(entity[0],cityStr,true);}@Override  protected String doInBackground(InputStream... in) {  //用来接受excute(String)里面的参数if(in == null){Log.d(TAG,"inputStream is null--------------------------");}SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp;try {sp = spf.newSAXParser();XMLReader reader = sp.getXMLReader();XMLHandler  handler = new XMLHandler();reader.setContentHandler(handler);            //               URL url = new URL(Weathers.WEB_URI + URLEncoder.encode(city));
//              InputStream is = url.openStream();InputStreamReader isr = new InputStreamReader(in[0],"GBK");InputSource source = new InputSource(isr);reader.parse(source);CurrentEntity currentWeather = handler.getCurrentWeather();publishProgress(currentWeather);  //这个函数的参数的个数也是可以变化的      } catch (ParserConfigurationException e) {              e.printStackTrace();} catch (SAXException e) {              e.printStackTrace();} catch (UnsupportedEncodingException e) {              e.printStackTrace();} catch (IOException e) {               e.printStackTrace();}return null;}   @Override  protected void onPostExecute(String result) {  //这个参数是接受doInBackgound()的返回值的// 返回HTML页面的内容                 }  @Override  protected void onPreExecute() {  // 任务启动,可以在这里显示一个对话框,这里简单处理       }          }    private InputStream readWeatherDataFromInternet()  {          InputStream inStream = null;  try {  cityUrl = new URL(Weathers.WEB_URI + URLEncoder.encode(cityStr,"gb2312"));Log.d(TAG,"------------------------------cityUrl = "+cityUrl);URLConnection connection = cityUrl.openConnection();  HttpURLConnection httpConnection = (HttpURLConnection)connection;  int responseCode = httpConnection.getResponseCode();  if(responseCode == HttpURLConnection.HTTP_OK)  { Log.d(TAG,"httpurlconnection is ok=============================");inStream = httpConnection.getInputStream();  }else{  Log.d(TAG,"httpurlconnection is not ok=============================");}} catch (MalformedURLException e) {  Log.e(TAG,"MalformedURLException======================================");e.printStackTrace();  return null;} catch (IOException e) {  Log.e(TAG,"IOException=========================================="); e.printStackTrace();return null;}  return inStream;  } public interface HttpResponed{public void respond(CurrentEntity entity,String city,Boolean network);}}

说明:XMLHandler为解析XML文件的一个类

Thread类使用:

         Thread saveRecordingThread = new Thread(){public void run(){try {Thread.sleep(5000);} catch (InterruptedException e) {                        e.printStackTrace();}finally{saveRecording();}                   }};saveRecordingThread.start();

android 线程之AsyncTask相关推荐

  1. android handlerthread 线程管理,Android线程之HandlerThread

    概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...

  2. Android 多线程之IntentService 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...

  3. Android 多线程之HandlerThread 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426353 出自[zejian的博客] 关联文章: Android ...

  4. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  5. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  6. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  7. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  8. 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )

    文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...

  9. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

最新文章

  1. Python组合数据类型之字典类型
  2. mpi4py多进程实例/举例
  3. ROS2学习(六).ROS概念 - 服务质量设置
  4. duilib设置透明窗口_界面开发心得与Duilib | 学步园
  5. C语言基础之--sizeof()运算符的使用以及注意
  6. Oracle触发器2-DML触发器
  7. Windows7之SSH,安装OpenSSH实现SSH客户端及服务
  8. python实现天气预报_python实现智能语音天气预报
  9. linux下检查是否安装过某软件包
  10. JAVA注解行_java注解
  11. java集合框架之Collection
  12. 第九章 jQuery验证插件简介
  13. 切片与MapTask并行度决定机制
  14. 算法:Design Circular Deque(设计一个双端队列)
  15. c#中excel文件怎么转换为dbf文件
  16. python做词典_python实现电子词典
  17. hibernate二级缓存机制
  18. 规则引擎Drools简述
  19. ERP管理软件哪家好?比较好的ERP管理系统软件推荐
  20. mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化

热门文章

  1. 企业创新系列之:雨巷邂逅
  2. ThinkPHP5.0中Request请求对象的使用和常用的操作
  3. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
  4. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)
  5. 关于运维架构技术的理想化形态设想
  6. windows server 2008配置之AD域服务器 1
  7. [转载] 的士速递3
  8. 一起谈.NET技术,Linq学习笔记
  9. 关注LoadRunner脚本回放日志中的Warning信息
  10. bootstrapSwitch bootstrap 的开关组件扩展