在android程序中一定不能阻塞UI线程,否则很容易就会弹出no respond 的对话框,导致程序退出。为了避免这种情况,一般需要较长时间执行的任务都放在线程中去执行,如从网上下载图片在界面的某个区域显示。但是使用线程回导致cpu开销过大,并且当线程管理不好时也会弹出no respond框。android提供了AsyncTask类用来处理这种情况;例如需要下载图片,然后在songImagButton中显示,下载的逻辑在songImageButton的initImage方法中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private class DrawImageTask extends AsyncTask{ // 更新图片显示区域,显示图片 @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不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。
以上内容转自:http://alex-yang-xiansoftware-com.iteye.com/blog/588327
本人心得:在一开始我在程序中使用了全局变量来进行数据传递AsyncTask这些参数,导致的问题是:如果重复调用这个类,则原有逻辑会乱,所以使用AsyncTask时,一定要注意尽量使用AsyncTask来进行参数传递。
0 条评论