歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Handler Message 通信機制

Android Handler Message 通信機制

日期:2017/3/1 10:45:22   编辑:Linux編程

Android UI線程更新並不是線程安全的,並且必須在UI線程中進程UI更新操作,以下面一個錯誤為例:

  1. public class MainActivity extends Activity {
  2. private String title;
  3. private Button btn;
  4. private final Handler handler = new Handler(){
  5. @Override
  6. public void handleMessage(Message msg) {
  7. setTitle(title);
  8. }
  9. };
  10. @Override
  11. public void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. btn = (Button) findViewById(R.id.time);
  15. btn.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View arg0) {
  18. Timer timer = new Timer();
  19. timer.schedule(new MyTask(), 1000);
  20. }
  21. });
  22. }
  23. class MyTask extends TimerTask{
  24. Message msg;
  25. Bundle bundle;
  26. SimpleDateFormat sdf;
  27. public MyTask(){
  28. Message msg = new Message();
  29. Bundle bundle = new Bundle();
  30. sdf = new SimpleDateFormat();
  31. }
  32. @Override
  33. public void run() {
  34. String date = sdf.format(new Date());
  35. //在子線程中更新UI
  36. setTitle("當前時間 :"+date);
  37. }
  38. }
  39. }

上面的例子會報“Only the original thread that created a view hierarchy can touch its views.

正確的寫法應該是在子線程中組裝數據,然後通過handler發送消息給UI線程,最後在UI線程中更新UI:

  1. public class MainActivity extends Activity {
  2. private Button btn;
  3. private final Handler handler = new Handler(){
  4. @Override
  5. public void handleMessage(Message msg) {
  6. //接收消息
  7. switch (msg.what) {
  8. case 110:
  9. Bundle bundle = msg.getData();
  10. String date = bundle.getString("date");
  11. //更新UI
  12. setTitle(date);
  13. break;
  14. }
  15. }
  16. };
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. btn = (Button) findViewById(R.id.time);
  22. btn.setOnClickListener(new OnClickListener() {
  23. @Override
  24. public void onClick(View arg0) {
  25. Timer timer = new Timer();
  26. //設置每秒執行一次
  27. timer.schedule(new MyTask(),0,1000);
  28. }
  29. });
  30. }
  31. class MyTask extends TimerTask{
  32. Message msg;
  33. Bundle bundle;
  34. SimpleDateFormat sdf;
  35. public MyTask(){
  36. msg = new Message();
  37. bundle = new Bundle();
  38. sdf = new SimpleDateFormat("yyyy年MM月dd : HH時mm分ss");
  39. }
  40. @Override
  41. public void run() {
  42. //組裝數據
  43. String date = sdf.format(new Date());
  44. msg.what = 110;
  45. bundle.putString("date", date);
  46. msg.setData(bundle);
  47. //發送消息
  48. handler.sendMessage(msg);
  49. }
  50. }
  51. }

Copyright © Linux教程網 All Rights Reserved