AsyncTask详解
来源:互联网 发布:华尔街英语软件课程 编辑:程序博客网 时间:2024/06/05 18:30
AsyncTask异步任务详解
我们在做网络请求数据,加载大图片,进行各种计算等等耗时操作时。常用的做法就是thread+Handler.哪里需要耗时操作哪里就new一个子线程。这种做法的灵活性很高,但是代码量也相当大。谷歌给我们提供了一个专门处理类似请求的类,这就是AsyncTask。
AsyncTask其实就是线程池+Hanlder的包装,使用AsyncTask使开发变得更加简单。
AsyncTask的四个方法详细说明
onPreExecute()
- 调用时机:第一个调用的方法,在任务还没开始前就调用
- 作用:通常在这里弹出一个ProgressDialog来提醒用户开始加载数据了
- 调用线程:主线程
- 参数:无
- 返回值:无
doInBackground()
这个方法是必须实现的(其余三个不是必须要实现的),通常你创建的子类在继承了AsyncTask后会提示你实现这个抽象方法。
- 调用时机:在onPreExecute方法后调用
- 作用:处理耗时操作(如网络请求)
- 调用线程:子线程(处理耗时操作嘛一定是子线程)
- 参数:这个方法的参数类型由AsyncTask<String,String,String>泛型的第一个参数指定,如果泛型第一个参数是String,此处就为String。参数的值是由execute()方法传来的。
- 返回值:就是耗时操作完成后得到的结果。要传到onPostExecute方法去更新ui.
onPostExecute()
- 调用时机:在doInBackground方法执行完毕后调用 *
- 作用:更新UI(各种控件,TextView,ImageView等)
- 调用线程:主线程(子线程不能更新UI~~~)
- 参数:参数类型,由泛型的第三个参数限定。值,doInBackground传递过来的。
- 返回值:无
onProgressUpdate()
- 调用时机:在手动调用publishProgress方法后调用。只有调用了publishProgress方法,此方法才生效。
- 作用:更新UI(进度条)
- 调用线程:主线程
- 参数:参数类型,由泛型的第二个参数限定。值,由publishProgress方法传递。
代码示例:
以下给个简单的Demo,参照上面对方法的解释,相信大家很快就会看懂。
`public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyTask().execute("aa","bb"); } class MyTask extends AsyncTask<String, Integer, String>{ private ProgressDialog dialog; /** * 弹出一个进度对话框 */ @Override protected void onPreExecute() { super.onPreExecute(); System.out.println("onPreExecute==========" + Thread.currentThread().getName()); dialog = new ProgressDialog(MainActivity.this);//创建一个进度条对话框 dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平样式 dialog.show(); } /** * 处理耗时操作 */ @Override protected String doInBackground(String... params) { //接收exectue方法传递来的参数,可变参数通常以一个数组保存 System.out.println(params[0]); System.out.println(params[1]); for(int i = 1; i<=10;i++){ System.out.println("doInBackground======" +i+ Thread.currentThread().getName()); publishProgress(i,10);//每打印一次,执行一次该方法来更新进度条 SystemClock.sleep(500);//休眠0.5秒 } return "数据被返回了..."; } /** * 更新ui,进度条 * 只有调用了publishProgress才执行 */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); System.out.println("onProgressUpdate========"+ Thread.currentThread().getName()); //参数是这个publishProgress(i,10)方法传递过来的,以数组的方式取出来 dialog.setProgress(values[0]);//设置进度 dialog.setMax(values[1]);//设置进度条最大值 } /**更新ui * */ @Override protected void onPostExecute(String result) { super.onPostExecute(result); dialog.dismiss();//当doInBackground执行完后隐藏对话框 //接收的参数result是doInBackground返回的值 System.out.println("onPostExecute======" + Thread.currentThread().getName() + result); } } }
运行结果如下:
0 0
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- AsyncTask 详解
- AsyncTask 详解
- AsyncTask详解
- AsyncTask 详解
- AsyncTask 详解
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- 详解AsyncTask
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- AsyncTask详解
- java代码优化浅析
- 微信文档错误,40001 ,access 错误等等。微信你能不能认真的写文档!!!
- MySQL_Base
- Aizu 2306 Rabbit Party DFS
- 疯狂Java笔记:3.4 基本数据类型
- AsyncTask详解
- HTML5的表单功能合集
- Android Studio安卓项目目录结构详解(思维导图)
- wordpress和微信平台那些事
- Java中的this和super
- ViewGroup的touch事件:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
- 412. Fizz Buzz
- UVA.11464 Even Parity (思维题 开关问题)
- html+css+js好看的梅花