編輯:關於Android編程
如果程序需要異步處理耗時操作,我們通常會新建一個子線程,在子線程完成處理後,通過handler回調通知UI線程刷新頁面數據。很多時候我們都會使用new Thread(Runnal對象).start();來處理,今天,給大家介紹一下ExecutorService線程池的用法。
為什麼要引入線程池?
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; } }}
這裡畫了個餅圖的變種,具有分割突出效果的餅圖(Pie Chart),就是個切蛋糕效果的餅圖,畫這種圖,其技巧就在於圓心的偏移。 在圓心偏移,半徑不變的基礎上,效果就出來了
一、概述相信大家在使用Android Studio的時候,或多或少的會使用一些插件,適當的配合插件可以幫助我們提升一定的開發效率,更加快樂。例如:https://gith
我們首先來說一下傳統的Linux基於uid,gid的權限管理機制:1、用戶的uid gid gids:Ubuntu操作系統當前登陸的用戶是jltxgcy,那麼該用戶的ui
一.內存洩漏概念1.什麼是內存洩漏?用動態存儲分配函數動態開辟的空間,在使用完畢後未釋放,結果導致一直占據該內存單元。直到程序結束。即所謂的內存洩漏。其實說白了就是該內存