Android 结合实例学会AsyncTask的使用方法

Android 结合实例学会AsyncTask的使用方法

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

AsyncTask运行时经过四个步骤,运行四个方法:
    
     1.onPreExecute(),执行在UI线程,能够设置或改动UI控件,如显示一个进度条
    
     2.doInBackground,执行在后台线程,不能够设置或改动UI控件,该方法的执行时机是:
     onPreExecute()运行完成马上调用该方法,在方法中进行耗时操作,能够在该方法中调用publishProgress方法
     来公布当运行的进度,调用publishProgress方法后就会马上触发onProgressUpdate方法
    
     3.onProgressUpdate,执行在UI线程,能够设置或改动UI控件
    
     4.onPostExecute,执行在UI线程,能够设置或改动UI控件,该方法在doInBackground方法执行完成
     后就会调用,该方法的參数就是doInBackground方法返回的结果,能够这样思考:doInBackground方法
     既然有一个返回结果,那么这个返回结果究竟返回给谁呢?答案就是:通过參数形式传递给onPostExecute方法

    
     參数说明:
     1.doInBackground方法的形參相应的是AsyncTask的第一个參数,即參数类型要同样。doInBackground方法
     接收实參的时机是:在UI线程中调用execute方法时为execute方法设置值,调用execute方法,这个值就会通过參数形式传给doInBackground方法,doInBackground方法返回的结果相应的是AsyncTask的第三个參数,即參数类型要同样,
    
     2.onPostExecute方法的參数值就是doInBackground方法返回的结果传递过来的。因此onPostExecute方法的參数
     类型与AsyncTask的第三个參数也相应。即同样
    
     3.onProgressUpdate方法的參数类型与AsyncTask的第二个參数相应,即參数类型要同样,在doInBackground方法中能够调用
     publishProgress方法将进度值传递给onProgressUpdate方法,进度值的类型由AsyncTask的第二个參数类型决定
    
     參数说明小结:

     1.AsyncTask的第一个參数类型决定了doInBackground方法、execute方法的參数类型
     2.AsyncTask的第二个參数类型决定了publishProgress方法、onProgressUpdate方法的參数类型
     3.AsyncTask的第三个參数类型决定了doInBackground方法的返回值类型、onPostExecute方法的參数类型

     注:假设不须要參数传递,那么AsyncTask的參数列表能够写成:AsyncTask<Void, Void, Void>
    
     使用AsyncTask类必须遵循的规则:
     1.AsyncTask类必须在UI thread载入
     2.Task实例必须在UI thread中创建
     3.execute方法必须在UI thread中调用
     4.不要手动调用onPreExecute、onPostExecute、doInBackground、onProgressUpdate方法
     5.该Task仅仅能运行一次,多次调用将会抛出异常
     AsyncTask类的使用能够參见AsyncTask源代码凝视部分,当中有具体说明


(原文链接:http://blog.csdn.net/yelangjueqi/article/details/38322647,欢迎转载,转载时请注明出处!!) 

展示一个样例:
packagecom.text.asynctaskdemo;

importandroid.app.Activity;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.util.Log;

publicclassMainActivity extends Activity {
     privatestaticfinalString TAG = “asynctaskdemo”;

     @Override
     protectedvoidonCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          new LoadAllAppsTask().execute( “Test AsyncTask”);
     }

     privateclassLoadAllAppsTask extends AsyncTask<String, Integer, Long> {
          
          @Override
          protectedvoidonPreExecute() {
              // TODO Auto-generated method stub
              Log.d(TAG,“onPreExecute”);
              super.onPreExecute();
          }

          @Override
          protectedLong doInBackground(String… params) {
              // TODO Auto-generated method stub
              Log.d(TAG,“doInBackground params[0]=”+params[0]);
              publishProgress(10);
              return100L;
          }

          @Override
          protectedvoidonProgressUpdate(Integer… values) {
              // TODO Auto-generated method stub
              Log.d(TAG,“onProgressUpdate values[0]=”+ values[0]);
              super.onProgressUpdate(values);
          }

          @Override
          protectedvoidonPostExecute(Long result) {
              // TODO Auto-generated method stub
              Log.d(TAG,“onPostExecute result=”+ result);
              super.onPostExecute(result);
          }
     }
}


输出结果:
06-10 14:17:08.724: DEBUG/asynctaskdemo(7419): onPreExecute
06-10 14:17:08.731: DEBUG/asynctaskdemo(7419): doInBackground params[0]=Test AsyncTask
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onProgressUpdate values[0]=10
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onPostExecute result=100

doInBackground(String… params)方法的形參列表能够接受多个參数值,以下演示一下,接受多个參数值的过程:
1.execute方法中传入多个參数:
newLoadAllAppsTask().execute(“Test AsyncTask”, “Test AsyncTask2”,“Test AsyncTask3“);
2.doInBackground方法中获取第二个參数的值时,直接params[1]就能够取到,获取第三个就使用params[2],例如以下:
          protectedLong doInBackground(String… params) {
              // TODO Auto-generated method stub
              Log.d(TAG,“doInBackground params[1]=”+ params[1]);
              publishProgress(10);
              return100L;
          }
改动之后,执行上面程序,输出结果:
06-10 14:24:57.834: DEBUG/asynctaskdemo(8269): onPreExecute
06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask2
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=10
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118081.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • phpstrom2021 激活码【2021最新】

    (phpstrom2021 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
  • 分子模拟软件amber_Gromacs联用GAFF力场处理水溶剂下小分子动力学

    分子模拟软件amber_Gromacs联用GAFF力场处理水溶剂下小分子动力学与GROMACS偏重生物大分子模拟的力场不同,AMBER支持很多方便处理有机小分子的力场(详见http://sobereva.com/115),如GAFF力场,简单而又有不错的精度,适合处理有机小分子;这里将介绍用Gaussian计算RESP电荷,交由Amber生成GAFF力场下的拓扑文件,最后用GROMACS模拟的过程。软件版本:AmberTools18,Gromacs2019-beta-1…

    2022年5月25日
  • 为什么执行不了程序_电脑软件无法执行代码怎么办

    为什么执行不了程序_电脑软件无法执行代码怎么办程序为什么不执行?

    2022年4月22日
  • Spring Boot 日志管理

    Spring Boot 日志管理在代码有问题的时候,很多人应该都是通过debug的方式去排查,往往忽略了日志的重要性。好的日志管理可以快速定位问题出现的位置,也可以提高代码的阅读性。这篇博文主要介绍一下SpringBoot中关于日志方面的知识。一、Logging介绍SpringBoot为JavaUtilLogging,Log4J2和Logback提供了默认配置。每个日志框架,都默认配置了控…

    2022年5月29日
  • leetcode单调队列_单调栈leetcode

    leetcode单调队列_单调栈leetcode0x00单调栈主要回答这样的几种问题比当前元素更大的下一个元素比当前元素更大的前一个元素比当前元素更小的下一个元素比当前元素更小的前一个元素0x01问题一维护一个单调递减的栈。Leetcode496:下一个更大元素I(超详细的解法!!!)Leetcode503:下一个更大元素II(超详细的解法!!!)Leetcode739:每日温度(超详细的解法!!!)cl…

    2022年9月22日
  • 朋友圈投票怎么刷票呢_微信投票最低多少一票

    朋友圈投票怎么刷票呢_微信投票最低多少一票揭露微信朋友圈当中出现刷票群0.01一票微信号、刷票0.01一票微信号的虚假面目,在微信朋友圈,每个人可能都遇到过好友“晒”出的投票链接,不过,看似单纯的微信投票背后,却乱象丛生,甚至还暗藏着灰色利益链。                                      变了味的朋友圈投票  “亲,帮我家孩子投个票吧”,“今天继续投哟,一天3票哦”……相信不少人在朋友圈或微信群中都收到过…

    2022年9月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号