说说android异步加载的三种方式之AsyncTask使用
虽然使用线程能适用大部分异步的场景,但是代码看起来还是不够简练,在android平台,还有另外一种解决方案----AsyncTask。
首先直接上代码:
private class getRemoteDataTask extends AsyncTask<String, Integer, ArrayList<Hashtable<String, String>>> {protected void onPostExecute(ArrayList<Hashtable<String, String>> dataList) {this.cancel(false);}@Overrideprotected ArrayList<Hashtable<String, String>> doInBackground(String... params) {ArrayList<Hashtable<String, String>> dataList = new ArrayList<Hashtable<String, String>>();return dataList;}}?
下面来解释一下,doInBackground方法类似于在线程中的run方法,这个方法是另一个后台线程中执行,然后执行完会通过回调机制执行onPostExecute,神奇之处就在于,onPostExecute这个方法的执行权限又交回给activity的主进程中执行,也就是说onPostExecute这个方法里面可以操作UI。于是就能实现异步读取数据,并且操作UI,是不是比起自己写线程方便很多?
然后我们来剖析一下,这种方案的几个不太容易理解的地方。
一、AsyncTask<String, Integer, ArrayList<Hashtable<String, String>>> 注意这里几个泛型的定义和意义,第一个代表该方法被调用时传递的参数类型,注意是参数的类型,而不是参数的个数,也就是说如果定义为String,那么,该方法被调用时所传递的参数只能是String类型;然后第二个Integer,资料上说是线程后台执行的百分比,不过我没彻底弄清楚这个的含义,欢迎大家指教,然后泛型里的第三个ArrayList<Hashtable<String, String>,这个和该类的两个方法都有密切联系,该泛型是指后台执行返回的结果的类型。
二、doInBackground这个方法是在后台执行的,然后它的返回结果将提供给onPostExecute,所以,doInBackground的返回值必须和AsyncTask类的第三个泛型定义一致,然后onPostExecute的参数类型必须和doInBackground的返回类型一致。
三、前边我们都一直在解释AsyncTask这个类,但是怎么调用呢?其实很简单
new getRemoteDataTask().execute(String... params);
?注意,execute方法里传递的参数的类型必须和AsyncTask第一个泛型的类型一致,然后这个方法传递的参数将在
doInBackground(String... params)
这里面起作用。
第四,AsyncTask还有很多方法,我们仅仅分析了其中两个,它被继承后,必须要重写的一个方法是doInBackground,因为doInBackground的返回值将在onPostExecute中被用来更新UI,所以我们姑且认为这两个方法是最重要。
第五、AsyncTask的实例必须在UI线程中被调用、execute(String...params)必须在UI线程中调用、不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)等方法、AsyncTask只执行一次。
?
必须吻一个