Android 中的AsyncTask的使用心得
在android程序中一定不能阻塞UI线程,否则很容易就会弹出no respond 的对话框,导致程序退出。为了避免这种情况,一般需要较长时间执行的任务都放在线程中去执行,如从网上下载图片在界面的某个区域显示。但是使用线程回导致cpu开销过大,并且当线程管理不好时也会弹出no respond框。android提供了AsyncTask类用来处理这种情况;例如需要下载图片,然后在songImagButton中显示,下载的逻辑在songImageButton的initImage方法中。
Java代码
private class DrawImageTask extends AsyncTask<Void,Integer,Void>{ //更新图片显示区域,显示图片 @Override protected void onPostExecute(Void params) { // TODO Auto-generated method stub songImageButton.invalidate(); this.cancel(false); } //下载图片 @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub songImageButton.initImage(); return null; } }
private class DrawImageTask extends AsyncTask<Void,Integer,Void>{//更新图片显示区域,显示图片 @Override protected void onPostExecute(Void params) { // TODO Auto-generated method stub songImageButton.invalidate(); this.cancel(false); }//下载图片 @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub songImageButton.initImage(); return null; } }
一般在doInBackground中执行后台的逻辑,如下载图片或其他需要耗时长的任务,onPostExecute方法用来对界面进行操作。如果后台的逻辑有返回值,则由doInBackground返回然后传入onPostExecute方法,然后更新界面。doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
当然我个人认为AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。