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();