AsyncTask为我们提供了一个在后台执行耗时的操作并同步更新UI的方法.
AsyncTask中有三个参数:
class MyAsyncTask extends AsyncTask<参数1,参数2,参数3>{}
- 参数1:向后台任务的执行方法传递参数的类型
- 参数2:在后台任务执行过程中,要求主UI线程处理中间状态,通常是一些UI处理中传递的参数类型
- 参数3:后台任务执行完返回时的参数类型
其中参数1和参数2是一个varags,例如String…,相当于String[].
我们可以在主程序中生成一个AsyncTask并执行execute方法启动AsyncTask:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.myText);
//等待3秒, 然后执行AsyncTask更新界面TextView
SystemClock.sleep(3000);
//MyAsyncTask是我在下面定义的AsyncTask的子类
new MyAsyncTask().execute();
}
注意AsyncTask只能被执行一次, 如果执行第二次, 会抛出错误.
下面给出一个简单的MyAsyncTask:
private class MyAsyncTask extends AsyncTask<Void, String, Void>
{
@Override
//参数类型是AsyncTask<>的第一个参数
protected Void doInBackground(Void...params)
{
String text = "hello world";
//把text传递给onProgressUpdate
//参数类型是AsyncTask<>的第二个参数
publishProgress(text);
//可以看到这段代码是在后台线程中执行的
System.out.println(Thread.currentThread().getName());
//返回值传递给onPostExecute
//参数类型是AsyncTask的第三个参数
return null;
}
@Override
//参数类型是AsyncTask<>的第二个参数
protected void onProgressUpdate(String...text)
{
//更改UI
textView.setText(text[0]);}@Override
//参数类型是AsyncTask<>的第三个参数
}
@Override
//参数类型是AsyncTask<>的第三个参数
protected void onPostExecute(Void result)
{
//当doInBackground完成后执行
Toast.makeText(MainActivity.this, "AsyncTask Completed", Toast.LENGTH_LONG).show();
}
}
doInBackground ------ 在主程序中执行execute方法时将执行此方法, 此方法在后台线程中执行, 所以不能在这个方法里执行UI操作. UI操作只能在主线程中执行的. 这个方法的参数类型是AsyncTask<>的第一个参数,返回值类型是AsyncTask<>的第三个参数
onProgressUpdate ------ 这个方法在主线程中执行, 所以可以用来执行UI操作. 而且这个方法接收publishProgress传递的参数, 通常在doInBackground中执行publishProgress方法传递后台执行的结果数据, 然后由onProgressUpdate更新UI, 以此实现同步更新UI. 这个方法以及publishProgress的参数类型是AsyncTask<>的第二个参数.
onPostExecute ------- 这个方法在doInBackground执行完后执行, doInBackground的返回值会传递进来. 这个方法也是在主线程中执行, 所以可以在AsyncTask完成时, 用来执行更新UI的操作
onPreExecute ------- 这个方法是在doInBackground执行之前调用的, 在主线程中执行. 可以用来在UI界面设置一个progress bar显示后台任务的执行进度.
PS: AsyncTask中的参数都是范式的书写方式.