标签:执行时间 sage ima 消息 int over 一个 post nba
AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程用于更新UI。
可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask 并不合适进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。
1 ) Async使用的优点:
l 简单,快捷
II 过程可控
使用的缺点:
l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
2 )Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)
运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:
l 结构清晰,功能定义明确
lI 对于多个后台任务时,简单,清晰
使用的缺点:
l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
Android 的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
有必要的话你还得重写以下这三个方法,但不是必须的:
使用AsyncTask类,以下是几条必须遵守的准则:
HandlerThread 其实是一种Thread,它是可以使用Handler的THread,它的实现其实很简单就是在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop来开启消息循环,这样在实际的使用
中就允许在HandlerThread中创建Handler了。
private void init4(){ //创建一个线程,线程名字:handler-thread myHandlerThread = new HandlerThread( "handler-thread") ; //开启一个线程 myHandlerThread.start(); //在这个线程中创建一个handler对象 Log.d(TAG, "init4: "+Thread.currentThread().getId()); handler3 = new Handler( myHandlerThread.getLooper() ){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作 Log.d(TAG , "消息: " + msg.what + " 线程: " + Thread.currentThread().getId() ) ; } }; //在主线程给handler发送消息 handler3.sendEmptyMessage( 1 ) ; new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "new runnable "+Thread.currentThread().getId()); //在子线程给handler发送数据 handler3.sendEmptyMessage( 2 ) ; } }).start() ; }
使主界面更流畅。 它有自己的MessageQueue不会干涉主线程中的消息队列。
AsyncTask、HandlerThread、IntentService和线程池
标签:执行时间 sage ima 消息 int over 一个 post nba
原文地址:http://www.cnblogs.com/NeilZhang/p/7450185.html