Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之ExecutorService線程池

Android之ExecutorService線程池

編輯:關於Android編程

如果程序需要異步處理耗時操作,我們通常會新建一個子線程,在子線程完成處理後,通過handler回調通知UI線程刷新頁面數據。很多時候我們都會使用new Thread(Runnal對象).start();來處理,今天,給大家介紹一下ExecutorService線程池的用法。

為什麼要引入線程池?

1.)new Thread()的缺點
  • 每次new Thread()耗費性能
  • 調用new Thread()創建的線程缺乏管理,被稱為野線程,而且可以無限制創建,之間相互競爭,會導致過多占用系統資源導致系統癱瘓。
  • 不利於擴展,比如如定時執行、定期執行、線程中斷
2.)采用線程池的優點
  • 重用存在的線程,減少對象創建、消亡的開銷,性能佳
  • 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞
  • 提供定時執行、定期執行、單線程、並發數控制等功能

 

讓我們體驗一下它的簡單用法吧,代碼示例:
public class GetTMKActivity extends AppCompatActivity { private TMKManager mTMKManager; private TextView log; private static long lastClick = 0; private ExecutorService executorService; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x1: if (log != null) { log.setText((String) msg.obj); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_get_tmk); log = (TextView) findViewById(R.id.result); LogUtil.isLogEnable(true); mTMKManager = new TMKManager(); mTMKManager.onCreate(this); executorService = Executors.newSingleThreadExecutor(); } @Override protected void onDestroy() { super.onDestroy(); mTMKManager.onDestroy(); if (executorService != null) { executorService.shutdownNow(); } } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { super.onResume(); mTMKManager.onResume(); } private boolean canClick() { if (System.currentTimeMillis() - lastClick > 500) { lastClick = System.currentTimeMillis(); return true; } Toast.makeText(GetTMKActivity.this, "click too fast", Toast.LENGTH_SHORT).show(); return false; } public void clickDo(View v) { if (!canClick()) { return; } switch (v.getId()) { case R.id.ic_getSerialNo: executorService.submit(new Runnable() { @Override public void run() { // 用過Handler的人都知道,Message有兩種獲取方法: // Message msg = new Message(); 或者 Message msg = handler.obtainMessage(); // 這兩種方法的區別是,前者是new的,需要開辟內存空間;後者是從global Message pool中取,性能消耗相對少; Message.obtain(mHandler, 0x1, "serialNo:" + mTMKManager.getICKeyCardHelper().getSerialNo()).sendToTarget(); } }); break; case R.id.ic_getTMK: executorService.submit(new Runnable() { @Override public void run() { Message.obtain(mHandler, 0x1, "tmk:" + mTMKManager.getICKeyCardHelper().getTMK("7dsSJ2mk4LJBv4i9WaoUecjKYvavAHEU")).sendToTarget(); } }); break; case R.id.ic_getTMK2: executorService.submit(new Runnable() { @Override public void run() { Message.obtain(mHandler, 0x1, "Mkey:" + mTMKManager.getICKeyCardHelper().getTransKey()).sendToTarget(); } }); break;

} }}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved