关于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)