runOnUiThread 是Android开发中一个重要的方法,可以在非UI线程中切换到UI线程来执行一些UI相关的操作。
「更新UI」:在Android中,UI线程是负责处理UI相关的事件和更新UI的。如果在非UI线程中直接更新UI,会导致应用程序崩溃或出现其他不可预知的问题。runOnUiThread 提供了一种从非UI线程更新UI的方式,确保UI操作在UI线程中执行。
「保持线程安全」:使用 runOnUiThread,可以确保在多线程环境下,UI的更新是线程安全的。
Activity源码中runOnUiThread方法:
finalHandlermHandler=newHandler();private Thread mUiThread;// ...publicfinal void runOnUiThread(Runnableaction){if(Thread.currentThread()!=mUiThread){ mHandler.post(action);}else{action.run();}// ...}
「Handler机制」:runOnUiThread 的原理基于Android的 Handler 机制。当调用 runOnUiThread 时,如果当前线程是UI线程,则直接执行传入的 Runnable 的 run 方法。如果当前线程不是UI线程,会将 Runnable 对象封装成一个 Message 对象,并将其发送到UI线程的消息队列中。
「消息队列」:UI线程中有一个消息队列(MessageQueue),用于存储待处理的消息。当UI线程空闲时,会从消息队列中取出消息并执行。
「Looper」:UI线程中还有一个 Looper 对象,负责不断地从消息队列中取出消息并执行。当调用 Handler 的 post 方法或 sendMessage 方法时,实际上是将任务发送到 Looper 的消息队列中。
「调用方式」:runOnUiThread 是 Activity 类中的一个方法,只能在 Activity 或 Fragment 中使用。
「参数」:runOnUiThread 接受一个 Runnable 参数。在 Runnable 的 run 方法中编写需要在UI线程中执行的代码。
publicclass MainActivity extends AppCompatActivity { private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);textView=findViewById(R.id.tv_test);new Thread(new Runnable(){@Overridepublicvoid run(){ try { Thread.sleep(2000);} catch(InterruptedException e){ e.printStackTrace();}// 更新UIrunOnUiThread(new Runnable(){@Overridepublicvoid run(){ textView.setText("更新后的文本");} });} }).start();} }
「只能在Activity或Fragment中使用」:由于 runOnUiThread 是 Activity 类的方法,因此只能在 Activity 或 Fragment 的上下文中使用。
「避免频繁调用」:runOnUiThread 提供了方便的线程切换方式,频繁地从非UI线程切换到UI线程会增加线程切换的开销,影响应用的性能。
「确保线程安全」:在使用 runOnUiThread 时,需要确保传递的 Runnable 对象是线程安全的,以避免出现竞态条件等线程安全问题。