当前位置: 首页 > Web前端 > HTML

彩虹堂框架系统开发

时间:2023-04-02 17:06:00 HTML

【朝花夕拾】Android多线程(三)runOnUiThread一文-runOnUiThread()的使用和原理太简单了,作者开始懒得单独开篇写了。当然这里说的简单是针对对Handler比较熟悉的童鞋们。不过,麻雀虽小,五脏俱全,runOnUiThread()好歹也算是个王子了。它在众多从子线程切换到主线程的方法中占有一席之地,因此必须单独传记。好了,闲话少说,言归正传。runOnUiThread()是Activity类中的一个方法,用于从子线程切换到主线程,执行一些需要在主线程上执行的操作。这里直接看一个例子,看看它是如何使用的:;"复制代码")1publicclassMainActivityextendsAppCompatActivity{2privateTextViewtextView;,彩虹堂系统,彩虹堂小程序开发,彩虹堂软件开发,彩虹堂模型开发,彩虹堂源码开发。@Override4protectedvoidonCreate(BundlesavedInstanceState){5super.onCreate(savedInstanceState);6setContentView(R.layout.activity_main);7textView=findViewById(R.id.tv_test);8newThread(newRunnable(){9@Override10publicvoidrun(){11//在工作线程中做某事需要很长时间12runOnUiThread(newRunnable(){13@Override14publicvoidrun(){15textView.setText("test");16}17});18}19}).start();20}21};《复制代码》)很简单,直接在子线程中调用runOnUiThread方法,在第15行切换到主线程,直接修改UI。如果使用Lambda表达式,它看起来更简单:1newThread(()->{2//在工作线程中做某事需要很长时间3runOnUiThread(()->{4textView.setText("test");5});6}).开始();比起显式使用Handler,重写AsyncTask方法,是不是很爽?它不仅易于使用,而且其原理也非常简单。底层实际上是由封装的Handler实现的。关键代码如下:"复制代码")1//==========Activity=========2finalHandlermHandler=newHandler();34私有线程mUiThread;56finalvoidattach(...){7......8mUiThread=Thread.currentThread();9......10}1112/**13*在UI线程上运行指定的操作。如果当前线程是UI14*线程,则立即执行操作。如果当前线程15*不是UI线程,则将操作发布到UI线程的事件队列中。16*17*@paramaction要在UI线程上运行的操作18*/19publicfinalvoidrunOnUiThread(Runnableaction){20if(Thread.currentThread()!=mUiThread){21mHandler.发布(动作);22}否则{23动作.run();24}25};"复制代码")mHander是Activity的成员变量,也是在Activity实例化的时候初始化的。MainActivity继承自Activity,mHandler使用的looper自然就是主looper。attach方法也是在主线程中调用的,mUiThread代表主线程。第19行的方法很容易理解。如果方法运行在主线程上,Runnable的run方法会立即运行;如果不在主线程,就会投递到主线程的looper的MessageQueue中,排队等待执行。基本的使用和基本的原理都讲完了,够简单了,要讲的东西真的不多!真不愧是广大程序员的贴心小棉袄。如果Android的所有方法都这么简单,一定不会有那么多光头!嗯,洗个澡睡觉吧!