Android Handler機制
阿新 • • 發佈:2019-01-07
1.Handler機制
為了避免ANR,我們會通常把耗時操作放在子執行緒裡面進行,因為子執行緒不能更新UI,所以當子執行緒需要更新UI的時候就需要藉助到安卓的訊息機制,也就是Handler機制。
2.作用
避免ANR,程式掛了,崩潰了。
造成ANR原因:1.在Activity中超過五秒的時間未能響應的下一個事件。2.BroadcastReceive超過10未響應。
避免ANR:1.主執行緒不能執行耗時操作。2.子執行緒不能直接更新UI介面。
如何手動製造ANR:
public class MainActivity extends AppCompatActivity { private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { Thread.sleep(300000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
3.Handler的簡單應用
原理請關注:http://www.jianshu.com/p/9e4d1fab0f36public class MainActivity extends AppCompatActivity { private Button mButton; private Handler mHandler; @SuppressLint("HandlerLeak") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = findViewById(R.id.button); //new 一個Handler物件,複寫handleMessage方法 mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: mButton.setText("1"); break; case 2: mButton.setText("2"); break; } } }; mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //兩種傳遞方式 Message msg = Message.obtain(); msg.what = 1; mHandler.sendMessage(msg); mHandler.sendEmptyMessage(2); } }); } }