-Future-Handler实例分析
图1Thread+Handler+Looper+Message模型
现在开始介绍线程池+Future+handler的一些基本概念和使用demo实例.
线程池
.如果在程序中反复创建和销毁线程,将会对程序的反应速度造成严重影响,有时甚至会Crash掉程序.这里我们使用简单的ExecutorService类.
Future<?>
Handler
说了这么多,如果还有对基本概念不太熟悉的童鞋可以先移步到最后的参考文章里看下再回来看本文章,此处直接上代码干货.
方法一:利用sendMessage实现
public class MyActivity extends Activity {private final String TAG = "DemoExecutorService";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initFindView();setListener();}private TextView mTitle;private Button mBtn;private void initFindView() {mTitle = (TextView) findViewById(R.id.title);mBtn = (Button) findViewById(R.id.btn);}private void setListener() {mBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {TestCallBack testCallBack = new TestCallBack();testCallBack.loadToHandler();}});}private class TestCallBack {public TestCallBack() {Log.d(TAG, "#####TestCallBack===Constructor");}public void loadToHandler() {Handler myHandler = new Handler(getMainLooper()) {@Overridepublic void handleMessage(Message msg) {Log.d(TAG, "#######receive the msg?? what = " + msg.what);int num = msg.what;switch(num){case 1:mTitle.setText("######Yeah, we receive the first msg 1");break;case 2:mTitle.setText("######Yeah, we receive the second msg 2");break;default:break;}}};testExecutorHandler(myHandler);}}private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();Future<?> mTask;boolean mSendMsg;public void testExecutorHandler(final Handler handler) {Log.d(TAG, "########testExecutorHandler, mTask = " + mTask);if(mTask != null) {// 通过取消mTask,来实现之前排队但未运行的submit的task的目的,通过标志位不让其发msg给UI主线程更新.mTask.cancel(false);Log.d(TAG, "########mTask.isCannel? === " + mTask.isCancelled());mSendMsg = false;}Runnable r = new Runnable() {@Overridepublic void run() {mSendMsg = true;try {Log.d(TAG, "###step 1####start to sleep 6s.");Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}Message msg;Log.d(TAG, "#######1111 mSendMsg === " + mSendMsg);if(mSendMsg) {msg = handler.obtainMessage();msg.what = 1;handler.sendMessage(msg);} else {return ;}Log.d(TAG, "####step 2####start to sleep 4s.");try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}// 若没有重新obtainMessage的话,就会出现以下错误,因为已经被回收, 所以报错. 需要重新 obtainMessage().//E/AndroidRuntime( 1606): java.lang.IllegalStateException: The specified message queue synchronization barrier token has not been posted or has already been removed.Log.d(TAG, "#######22222 mSendMsg === " + mSendMsg);if(mSendMsg) {msg = handler.obtainMessage();msg.what = 2;handler.sendMessage(msg);} else {return ;}}};//mExecutor.submit(r);// 若只是这样子就不会进入Future任务里面,那样每一个submit提交的都会被依次执行.mTask = mExecutor.submit(r);}}
结果和打印如下图2和3所示:
图2图3
图4
方法二:利用runnable实现更新:
由于部分方法跟上面一样,,所以要看完整代码可以在下面下载,以下只是核心代码.
public void loadToRunnable() {Runnable runable = new Runnable(){@Overridepublic void run() {Log.d(TAG, "#########Ok..1111 let update callback1…");mTitle.setText("####Yeah, Refresh in runnable, callback1");}};Runnable runable2 = new Runnable() {@Overridepublic void run() {Log.d(TAG, "######Ok, let update callback2, …");mTitle.setText("####Callback2 update success!!!");}};testExecutorRunnable(runable, runable2, getMainLooper());}}
public void testExecutorRunnable(final Runnable callback,final Runnable callback2, final Looper looper) {Log.d(TAG, "#####testExecutor##mTask..#### = " + mTask);if(mTask != null) {mTask.cancel(false);// true 表示强制取消,会发生异常; false表示等待任务结束后取消.mSendMsg = false;}Runnable r = new Runnable(){@Overridepublic void run() {mSendMsg = true;try {Log.d(TAG, "#####Step 1####Async run after submit…###sleep 6s");Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}if(callback != null && mSendMsg){//Handler handler = new Handler();// Not use it, should use the Looper.Handler handler = new Handler(looper);handler.post(callback);}try {Log.d(TAG, "#####Step 2####Async run after submit…###sleep 4s");Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}if(callback2 != null && mSendMsg) {Handler handler = new Handler(looper);handler.post(callback2);}}};mTask = mExecutor.submit(r);}
代码下载路径:
原创文章,欢迎转载,转载请注明:blog.csdn.net/jjzhoujun2010
作者:Dream Fly
参考文章:
一切都在发展变化,不断地向昨天告别,满怀信心地投入每一个崭新的今天。