`
changkunyang
  • 浏览: 30315 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

说说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);
	}

	@Override
	protected 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只执行一次。

 

分享到:
评论
1 楼 linwanjin 2011-09-15  
必须吻一个

相关推荐

Global site tag (gtag.js) - Google Analytics