android 线程之AsyncTask
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相关推荐
- android handlerthread 线程管理,Android线程之HandlerThread
概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...
- Android 多线程之IntentService 完全详解
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...
- Android 多线程之HandlerThread 完全详解
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426353 出自[zejian的博客] 关联文章: Android ...
- Android多线程之ArrayBlockingQueue源码解析
阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...
- Android多线程之IntentService源码解析
想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- Asp.Net Core 轻松学-多线程之Task快速上手
Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言 Task是从 .NET Framework 4 开始引入的一 ...
- 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )
文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
最新文章
- Python组合数据类型之字典类型
- mpi4py多进程实例/举例
- ROS2学习(六).ROS概念 - 服务质量设置
- duilib设置透明窗口_界面开发心得与Duilib | 学步园
- C语言基础之--sizeof()运算符的使用以及注意
- Oracle触发器2-DML触发器
- Windows7之SSH,安装OpenSSH实现SSH客户端及服务
- python实现天气预报_python实现智能语音天气预报
- linux下检查是否安装过某软件包
- JAVA注解行_java注解
- java集合框架之Collection
- 第九章 jQuery验证插件简介
- 切片与MapTask并行度决定机制
- 算法:Design Circular Deque(设计一个双端队列)
- c#中excel文件怎么转换为dbf文件
- python做词典_python实现电子词典
- hibernate二级缓存机制
- 规则引擎Drools简述
- ERP管理软件哪家好?比较好的ERP管理系统软件推荐
- mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化
热门文章
- 企业创新系列之:雨巷邂逅
- ThinkPHP5.0中Request请求对象的使用和常用的操作
- UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
- 数据结构之二叉树_二叉排序树(严蔚敏C语言版)
- 关于运维架构技术的理想化形态设想
- windows server 2008配置之AD域服务器 1
- [转载] 的士速递3
- 一起谈.NET技术,Linq学习笔记
- 关注LoadRunner脚本回放日志中的Warning信息
- bootstrapSwitch bootstrap 的开关组件扩展