Android 子線程更新UI的六種方式


1、注意:

(1)子線程需要切換到UI線程或者主線程去更新線程。

(2)但是子線程單獨也是可以更新UI的,只是谷歌要求我們需要到UI線程去更新。

eg:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_thread_update_ui);
        new Thread(new Runnable() {
            @Override
            public void run() {
                textView.setText("子線程更新ui");
            }
        });
    }

此時我們運行發現,程序沒有任何問題。

eg:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_thread_update_ui);
        new Thread(new Runnable() {
            @Override
            public void run() {
                textView.setText("子線程更新ui");
                Thread.sleep(5000);
            }
        });
    }

當我們在里面添加耗時操作的時候,我們會發現程序崩潰。

原因:在oncreat()方法中,此時viewRootlmp還沒有被創建。viewRootlmp在Activity處於onResume之后才被創建的,所以不會執行checkThread方法,自然不會報錯。當進行耗時操作時,此時viewRootlmp已經創建成功,所以程序會崩潰。

(3)Android 采用單線程模式:如果采用多線程去更新UI會導致程序的不可控性,多線程會造成資源競爭。就算采用鎖來控制,那還是相當於采用單線程模式。

二、子線程更新UI的六種方式

(1)

 new Thread(new Runnable() {
            @Override
            public void run() {
                Message message=handler.obtainMessage();
                message.what=1;
                handler.sendMessage(message);
            }
        }).start();
 
 
  Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                textView.setText("子線程更新ui");
            }
        }
    };

(2)

new Thread(new Runnable() {
            @Override
            public void run() {
                textView.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("子線程更新ui");
                    }
                });
 
            }
        }).start();

(3)

new Thread(new Runnable() {
            @Override
            public void run() {
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("子線程更新ui");
                    }
                });
            }
        }).start();

(4)

new Thread(new Runnable() {
            @Override
            public void run() {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("子線程更新ui");
                    }
                },3000);//延遲時長
            }
        }).start();

(5)

new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("慕九");
                    }
                });
            }
        }).start();

(6)

new updateAsyncTask().execute();
 
class  updateAsyncTask extends AsyncTask<String,Integer,String> {
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected String doInBackground(String... strings) {
            publishProgress();
            return null;
        }
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }
 
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            textView.setText("子線程更新ui");
        }
    }


免責聲明!

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



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