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();
分享到:
相关推荐
12_Android 多线程AsyncTask详解
在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html
一个ListView的小例子,一开始List中没有内容,通过一个AsyncTask逐步在List中加入条目,适合新手学习AsyncTask多线程,本人整理能运行,有详细的注解。
Android中AsyncTask实现多线程计数,UI主线程运行,启动另一个线程计数并在UI主线程上显示.
Android是单线程模型,耗时的操作必须放在非主线程中执行,对此,我们需要使用多线程/线程池或者AsyncTask等来完成异步加载任务。 博客地址:http://blog.csdn.net/chenzheng8975/article/details/53893666
Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法demo
因为,UI线程主要是用来更新界面UI,如果一次进行太多的任务处理,并且这些任务需要相当的时间来完成,就会造成UI线程堵塞,结果可能是应用无响应(Android4.0以后,谷歌已经禁止在UI线程中进行“耗时操作”),这样的...
首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...
android Handler Thread AsyncTask httpURLConnection学习的代码
Android Asynctask 先小试牛刀,了解一下各个方法执行过程,关注博客http://himici.com/
使用AsyncTask实现的多任务多线程下载的Demo,支持断点续传。
主要为大家详细介绍了Android多线程AsyncTask的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
AsyncTask_演示线程阻塞,对应我的博客《Android专题之AsyncTask(一)基本概念介绍》,有问题欢迎留言讨论。
AsyncTask 异步多线程加载Demo
默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程。当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然...
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...
如果用现在做秒表,建议用asyncTask...
来处理,这样把任务放入工作线程中执行,不会占用主线程的时间片,所以主线程会及时响应用户的操作,如果使用new Thread来执行任务,那么如果需要中途取消任务执行或者需要返回任务执行结果,就需要我们自己维护很多...
rxjava2 线程间流式处理 asynctask