Android 使用AsyncTask 后监听异步加载完毕的动作

简介:

AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。

场景模拟

      当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用Handler 去更新UI,AsyncTask 也是一样使用到的Handler 只是它将Handler 封装在了onPostExecute 执行操作中。而这一操作可能会产生一个问题,比如你有一个列表更新数据库使用到的是AsyncTask 异步操作的方式更新UI,而你的需求是当我一进来这个列表就统计这个列表的数据的数量或者让某一行数据的状态为选中状态。传统做法是直接new 一个AsyncTask 类让它execute(); 之后会再操作UI。想法是对的,但有一个问题我们要注意到,因为它是异步加载数据的方式,而你的数据量比较多或许查找数据需要一定的时间的时候,这时使用AsyncTask 执行异步加载后更新UI再操作UI对象,可能会报空指针。

      这个问题的产生是,我们都知道代码的执行是自上而下执行,当你使用异步加载数据的时候,代码让你去执行异步操作就不管了(多线程),而继续会往下执行代码,你下面的代码就是操作列表里面的UI,这时可想而知,异步加载数据还没有结束还没有对你的UI进行更新,这些你的列表应该是空的,而操作一个空的列表就会报空指针。

分析问题

 

   使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

  • doInBackground   后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。
  • onPostExecute   相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。

     有必要的话你还得重写以下这三个方法,但不是必须的:

  • onProgressUpdate   可以使用进度条增加用户体验度。
  • onPreExecute           这里是最终用户调用Excute时的接口
  • onCancelled             用户调用取消时,要做的操作

      根据上面的思路,可以看出,最终数据加载并显示出来这一系列的操作都在onPostExecute  这个方法里面,那么如何监听所有UI都己经在onPostExecute   里面处理完成了,再去执行我们自己要操作呢?

 

解决问题

 

       这里给出我自己解决这一问题的思路,有更好想法的朋友欢迎跟贴共同探讨。

 

       首先创建一个接口

 

private   interface  isLoadDataListener {
        
public   void  loadComplete();
    }

     声明这一接口变量

 

private  isLoadDataListener loadLisneter;

 

  给接口赋值,得到接口对象

 

public   void  setLoadDataComplete(isLoadDataListener dataComplete) {
        
this .loadLisneter  =  dataComplete;
    }

 

之后在AsyncTask 的onPostExecute处理UI完成后调用该接口,下面给出一个我以前项目使用到的AsyncTask 类:

 

     class  loadGridAsyncTask  extends  AsyncTask < Integer, Integer, AppsAdapter >  {

        
private   int  poindex;

        
public  loadGridAsyncTask( int  positionindex) {
            
this .poindex  =  positionindex;
        }

        @Override
        
protected  AppsAdapter doInBackground(Integer... params) {
            
//  TODO Auto-generated method stub
            
//  mAppsModel.clear();
            Cursor temp  =  dbHelper.queryPageById(poindex);
            loadPage(mApps, temp);
            temp.close();
            
return   new  AppsAdapter(STB. this , mAppsModel);
        }

        @Override
        
protected   void  onPostExecute(AppsAdapter result) {

            gridViewExt itemGrid 
=  (gridViewExt) viewFlipper
                    .getChildAt(poindex);
            itemGrid.setColumnCount(pageColumnCount);
            itemGrid.setAdapter(result);
            
if  (loadLisneter  !=   null ) {
                loadLisneter.loadComplete();
            }
             
          }

    }

 

       通过上面的代码,我们就得到一个数据加载完成后返回的接口,接下来的问题就是我们利用这个接口来处理我们的UI了,比如让某一UI选中,得到这个列表的UI数量等,看下面的代码:

 

new  loadGridAsyncTask( 1 ).execute();
                                    setLoadDataComplete(
new  isLoadDataListener() {

                                        @Override
                                        
public   void  loadComplete() {
                                            
//  TODO Auto-generated method stub
                                             
// 这里执行你要的操作,当UI更新完成后会自动调用这里面的代码                                        }
                                    });





 本文转自 terry_龙 51CTO博客,原文链接: http://blog.51cto.com/terryblog/508629 ,如需转载请自行联系原作者
相关文章
|
6月前
|
Java 数据库 Android开发
Android异步之旅:探索AsyncTask
Android异步之旅:探索AsyncTask
57 0
|
6月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
292 0
|
2月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
84 1
|
4月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
41 2
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
96 2
|
5月前
|
Android开发
40. 【Android教程】AsyncTask:异步任务
40. 【Android教程】AsyncTask:异步任务
134 2
|
5月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
81 2
|
6月前
|
Android开发
Android监听USB设备插拔
Android监听USB设备插拔
889 7
|
6月前
|
数据库 Android开发
android AsyncTask
android AsyncTask
45 1