安卓的UI操作是非线程安全的,出于安全考虑,安卓只允许UI线程修改Activity里的UI组件。为了方便新启动的线程可以改变UI,安卓提供了Handler,Handler可以在新启动的线程中发送消息,也可以在主线程中接收消息。这种方式是基于回调的,当新启动的线程开始发送消息时,就会发送到与之对应的MessageQueen,而Handler只需从MessaeQueen中取出消息并处理即可。主UI线程一般在启动时会自动创建一个Looper,但是其他线程需要调用Looper.prepare()方法首先创建一个looper,looper会用于管理MessageQueen中的消息,会从MessageQueen中取出消息,并将其交给与发送消息相对应的接收消息的Handler。创建了looper后,在创建handler,并重写handleMessage()方法,之后再调用looper.loop()方法启动looper即可。
学习Handler后的总结
handler主要用来发送消息和处理消息,当有耗时操作时为了不阻塞主线程应该新启动一个线程,而这个时候如果新线程要和主线程通信,就可以利用Handler。在新线程中将要发送给主线程的信息利用sendMessage()方法发送到MessageQueen,handler在利用handleMessage()方法处理消息即可。TimerTask和Timer可以结合使用,Timer是一个定时器,利用timer.schedule()方法可以新启动一个线程,并且方法中的参数可以用于定义定时器,而TimerTask用于定义定时器中要干的事,需要重写run()方法。
而handler有几个方法,例如post()等,这些方法并未启动一个新的线程,不宜操作耗时任务。
AsyncTask
asyncTask即异步任务,可以在其中执行耗时操作,比起handler更要轻量级,asyncTask中的很多方法都是基于回调的。
onPreExecute();执行初始化操作;
doInBackground();这个方法会在后台线程完成,耗时操作放在这个方法中执行,执行这个方法时会调用publishProgress()方法来更新任务的执行速度,在publishProgress 方法执行完后会调用onProgressUpdate()方法更新任务;最后在doInBackground()方法执行完后会调用onPostExecute()方法,并将返回值传给此方法。
最后调用execute()方法开始执行耗时操作,调用此方法即会开始一个新的线程。
AsyncTask<Params,Progress,Result>
第一个参数Params是doInBackground()方法接收的参数,可以在开始耗时操作即调用execute()方法时传入,第二个参数表示onProgressUpdate()方法接收的参数,即publishProgress()方法传入的参数;最后一个参数表示onPostExecute()方法接受的参数,即doInBackground()方法的返回值。
-----------这些博客都是我之前在学习过程中自书中摘出的重点,以及一些前辈总结的经验,外加一些自己的感悟,如果有前辈看到,有不对的地方希望大家指出,非常感谢。
983

被折叠的 条评论
为什么被折叠?



