对于Android的IPC来说,除了Handler和Looper之外,还有另外一种简便的方法来实现多线程的通信,那就是AsyncTask。AsyncTask是一个异步的方法,它允许背景运算并把结果更新到前台的UI线程之上。要实现一个AsyncTask主要有4个步骤,但并不是每一个步骤都是必需的。

这四个步骤是:

onPreExecute()执行背景运算前任务的初始化;

doInBackground(Params...)这是AsyncTask最核心的函数,即是做背景运算;它在第一步完成之后被调用,通常在这步中还会调用方法publishProgress(Progress...)将运算结果更新到UI主线程上;

onProgressUpdate(Progress...)是在publishProgress(Progress...)调用之后被执行的,需要注意到是这步执行的时间是未定的,通常在这一步中会更新相关UI;

onPostExecute(Result)这一步同样是和UI相关,将运算结果Result当作参数传递给UI。

大家可能已经注意到AsyncTask除了四大步之外,还有三个重要的参数:AsyncTask<Params,Progress,Result>。三个参数为通用类型,Params是传给任务初始化的参数,Progress是做背景运算过程中和UI交互的参数,Result是背景运算传递给UI的结果。

利用好这四大步和三个参数,我们可以方便的写出上节例子中的Demo:

Java代码
  1. packagewaterlife.ipc.demo;
  2. importjava.io.InputStream;
  3. importjava.net.MalformedURLException;
  4. importjava.net.URL;
  5. importjava.net.URLConnection;
  6. importandroid.app.Activity;
  7. importandroid.os.AsyncTask;
  8. importandroid.os.Bundle;
  9. importandroid.widget.ProgressBar;
  10. publicclassmyAsyncTaskextendsActivity{
  11. staticProgressBarpb;
  12. /**Calledwhentheactivityisfirstcreated.*/
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. pb=(ProgressBar)findViewById(R.id.ProgressBar01);
  18. Downloaddl=newDownload();
  19. dl.execute();
  20. }
  21. publicclassDownloadextendsAsyncTask<Void,Integer,Void>
  22. {
  23. @Override
  24. protectedVoiddoInBackground(Void...params){
  25. //TODOAuto-generatedmethodstub
  26. inttotalSize=0;
  27. InputStreamrecevier=null;
  28. try{
  29. URLmyUrl=newURL("http://bbs.nju.edu.cn/");
  30. URLConnectionurlConn=myUrl.openConnection();
  31. totalSize=urlConn.getContentLength();
  32. recevier=urlConn.getInputStream();
  33. byte[]b=newbyte[256];
  34. intlength=0;
  35. length+=recevier.read(b);
  36. while(length<totalSize)
  37. {
  38. length+=recevier.read(b);
  39. publishProgress((int)(length*100/totalSize));
  40. }
  41. recevier.close();
  42. }catch(MalformedURLExceptione){
  43. //TODOAuto-generatedcatchblock
  44. e.printStackTrace();
  45. }catch(Exceptionex)
  46. {
  47. ex.printStackTrace();
  48. }
  49. returnnull;
  50. }
  51. protectedvoidonProgressUpdate(Integer...progress){
  52. pb.setProgress(progress[0]);
  53. }
  54. }
  55. }

在这个Demo中只有第二和第三步,只有第二个参数params,是一个整型参量,把下载数据包的进度更新给UI Progressbar显示。

另外,使用AsyncTask需要注意以下几点:

1.AsyncTask的实例只能在UI线程中创建;

2. dl.execute()方法只能在UI线程中调用,并且只能调用一次,否则会抛异常。

更多相关文章

  1. Android(安卓)开发自定义使用svg构造交互式中国(各国)地图
  2. Android服务器端开发
  3. Android中使用Post请求
  4. android 线程 销毁 问题
  5. android设置对话框背景透明度和弹出位置
  6. 关于Android自定义相机进行拍照(小米手机出现异常的原因)
  7. Android(安卓)高级面试题及答案
  8. android AsnyTask的使用
  9. Android软硬整合技术(HAL&Framework):高阶的课程篇

随机推荐

  1. Android(安卓)Studio - 快捷键详解-MAC版
  2. android中获取当前Activity的实例和名字
  3. android 摄像头的调用
  4. 最近总结的android疑惑(二)
  5. Android(安卓)EditText自定义样式的方法
  6. Android之Animation全介绍
  7. Android浏览器插件开发-Log
  8. 为TextView设置边框
  9. android浏览器下a/input等元素获得焦点时
  10. 如何设置Android中控件的颜色透明度