zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    web前端安全---读书笔记
    三色旗
    Pascal三角形
    汉诺塔算法
    冒泡排序算法
    HttpRunner 参数化数据驱动
    swagger接口变动监控
    HttpRunnerManager平台异步生成及展示代码覆盖率报告(ant+jacoco+jenkins+HttpRunnerManager)
    SonarQube+jenkins+maven平台搭建
    requests 模块
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4078001.html
Copyright © 2011-2022 走看看