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");
        }
    }

posted on 2022-03-31 15:46  ApeJ  阅读(1063)  评论(0编辑  收藏  举报