Android 子線程無法刷新UI界面


問題:在Android開發中,子線程無法直接更改UI界面視圖的刷新

這個時候 Handler 起到了至關重要的作用.

簡單來說 , Handler就是用來傳遞消息的.

Handler可以當成子線程與主線程的消息傳送的紐帶。

在安卓開發中,在子線程中無法刷新UI,是因為UI在子線程中刷新的話,是不安全的,如 多個線程刷新UI,會造成UI更新沖突,這樣是不安全的。

所以,Handler的作用就來了,子線程可以通過Handler來將UI更新操作切換到主線程中執行. 話不多說 上代碼:

//這里需要實現 View.OnClickListener 接口 
public class Test extends AppCompatActivity implements View.OnClickListener {    

        TextView textView;

        Thread myThread;
        
        Button buttonStart
         
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                
                //獲取文本視圖
                textView = findViewById(R.id.textView);
                
                //創建線程
                myThread = new TimeThread();
                
                //獲取開始按鈕
                buttonStart = findViewById(R.id.but_start);
                
                //開始按鈕單擊事件
                buttonStart.setOnClickListener(this);
   
        }
         //重寫onClick方法
         @Override
         public void onClick(View v) {
                 //判斷當前按的控件
                 switch (v.getId()) {
                       case R.id.but_start:
                              //開啟線程
                              myThread.start(); 
                              break;
                       default:
                              break;
                 }
         }
         
         
}


public class TimeThread extends Thread {
         //重寫run方法
        @Override
        public void run() {
            super.run();
            //一直循環
            while (true) {
                try {
                    //每秒執行一次
                    Thread.sleep(1000);
                    Message msg = new Message();
            // msg.what
= 1; //獲取當前系統時間 Date date= new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String now= dateFormat.format(date);
            //把時間放入Message msg.obj
= now ; //由Message傳遞給Handler 處理 myHandler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); break; } } } } private Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: //更新文本框里的值 textView.setText((String)msg.obj); break; default: break; } } };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM