关于Android AsyncTask的一些总结

jopen 11年前

     //实现异步的内部类        /**       * 第一个参数:String        * 传入:在调用该类对象时传入的参数       * 如:MyTask myTask=new MyTask(Context) myTask.execute(string)       * 调用:doInBackground(String... strings)       * strings是这个参数,通常用strings[0]使用       *        * 第二个参数:Integer 更新进度的参数        * 传入:调用publishProgress(int);传入       * 调用:onProgressUpdate(Integer... values)调用       * values是这个参数,values[0]使用       *        * 第三个参数:外部线程doInBackground(String... strings)执行的结果,是        这个方法的返回值       * 传入:给doInBackground()设置的返回值就是这个参数       * 调用:onPostExecute(String s)调用       * s 是这个参数       */      class  MyTask  extends AsyncTask< String, Integer, String > {          private Context context;          ProgressDialog pdialog;          /**          构造方法          可以在这初始化一些变量          */          public MyTask(Context context){              this.context=context;          }          /**           该方法将在执行实际的后台操作前被UI thread调用。           可以在该方法中做一些准备工作,如在界面上显示一个进度条           */          protected void onPreExecute() {              pdialog=new  ProgressDialog(context, 0);              super.onPreExecute();          }            /**          该方法运行在后台线程中。          这里将主要负责执行那些很耗时的后台计算工作。          可以调用 publishProgress方法来更新实时的任务进度。          该方法是抽象方法,子类必须实现。          */          protected String doInBackground(String... strings) {              for(int i=0;i<100;i++){                  try {                      //publishProgress这个方法                      //会获取实时进度传递给onProgressUpdate                      publishProgress(i);                      Thread.sleep(100);                  } catch (InterruptedException e) {                      e.printStackTrace();                  }              }                return null;          }          /**          在publishProgress方法被调用后,          UI thread将调用这个方法从而在界面上展示任务的进展情况,          例如通过一个进度条进行展示。           */          protected   void  onProgressUpdate(Integer... values) {              pdialog.setProgress(values[0]);//在这里更新进度条          }           /**         在doInBackground 执行完成后,         onPostExecute 方法将被UI thread调用,         后台的计算结果将通过该方法传递到UI thread.         */          protected void onPostExecute(String s) {              //显示结果的地方              super.onPostExecute(s);          }      }

运行顺序:从上到下

onPreExecute() 

doInBackground(String... strings) 

onProgressUpdate(Integer... values) //在publishProgress方法被调用后才调用

onPostExecute(String s)