Android(安卓)AsyncTask 使用
16lz
2021-12-04
Android AsyncTask 使用
题图 www.gratisography.com在Android中在UI线程中做耗时操作时,会引起UI线程的阻塞,出现UI界面的卡顿线程,有时还会引起ANR等异常情况
在Android中的耗时操作推荐通过异步操作来避免阻塞UI线程,AsyncTask
是Android中提供的一个异步操作的框架,
另外在Android中还有Thread
和Handler
,AsyncTask
适用于耗时比较小的操作,如果是需要一个线程长时间在
后台运行,请参考使用 Executor
ThreadPoolExecutor
FutureTask
AsyncTask 使用
private class MyTask extends AsyncTask{ @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... params) { String myString = params[0]; int i = 0; publishProgress(i); return "Result"; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); }}
new MyTask().execute("my string paramaters");//调用并执行
AsyncTask的参数说明
一般的使用的方法
private class MyTask extends AsyncTask { ... }
如果不需要参数请使用 Void
private class MyTask extends AsyncTask { ... }
- Params,这个参数就是在调用时,传递过来的参数
- Progress,耗时操作在后台执行的进度
- Result,后台操作完成之后,返回的结果
方法说明
- onPreExecute(),这个方法中可以更新UI,在耗时操作执行之前的操作
- doInBackground(String... params),这个是主要的方法,所有的耗时的操作需要在这个方法中处理,
在这个方法中可以调用publishProgress(Progress...)
方法来更新操作的进度 - onProgressUpdate(Integer... values),在上一部中调用
publishProgress(Progress...)
方法之后触发,在UI线程中执行
可以给用户操作的进度的显示(如 进度条) - onPostExecute(String result),在耗时操作完成之后,触发这个方法,在UI线程中执行,可以通知用户操作已经完成
使用示例
加载本地图库的照片,并通过GridView显示,核心代码
private void loadAlbum(){ AsyncTask asyncTask = new AsyncTask() { //耗时的操作 @Override protected Void doInBackground(Void... params) { Cursor c = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.ImageColumns.DATA},null,null, MediaStore.Images.ImageColumns.DATE_TAKEN+" desc "); if(null != c && c.getCount() > 0 && c.moveToFirst()){ while (c.moveToNext()){ mData.add(c.getString(c.getColumnIndex(MediaStore.Images.ImageColumns.DATA))); } } return null; } //耗时操作完成之后,调用这个方法,更新UI @Override protected void onPostExecute(Void aVoid) { loadData(); } }; asyncTask.execute();}
示例代码
更多相关文章
- Android里关于EventBus的使用
- Android的Message机制(简单小结)
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
- Android(安卓)如何使用GPU硬件加速
- Android,谁动了我的内存
- Android(安卓)使用html做UI的方法---js与java的相互调用
- Android连接Mysql数据库教程以及增删改查
- Android(安卓)AsyncTask
- 安卓从入门到精通路线图