一、looper.prepare()
Looper.prepare()是一个Android系统中的关键方法之一,在主线程中使用是为了创建消息循环(Message Loop)以便我们在主线程中发送和处理异步消息。在非主线程中使用Looper.prepare()是为了创建一个新的消息队列,并把它绑定到当前线程中。
调用Looper.prepare()方法将会为当前线程创建一个消息队列,后续通过Handler的sendMessage()方法发送消息就是将消息插入到这个队列中。调用Looper.loop()方法则是不断地从消息队列中取出消息,然后根据消息的类型分发给相应的Handler进行处理。
一般地,在创建Looper对象之后,接下来要调用Looper.prepare()方法,以便为这个Looper对象创建一个消息队列。
二、looper.prepare多次调用
如果我们在同一个线程中多次调用Looper.prepare()方法,将会发生什么事情呢?答案是会抛出异常:Only one Looper may be created per thread。
Looper.prepare()方法只能在当前线程中调用一次,多次调用会抛出RuntimeException异常。
try { Looper.prepare(); } catch (RuntimeException e) { Log.e(TAG, "prepare failed on this thread: " + Thread.currentThread()); return; }
三、looper.prepare looper.loop
调用Looper.prepare()方法和Looper.loop()方法可以开启一个消息循环机制,该机制可以让我们在主线程中进行异步操作。调用Looper.loop()方法会导致主线程进入无限循环状态,如果在主线程中调用该方法,那么该进程将无法响应其它的事件。
在调用Looper.loop()方法之前,需要先调用Looper.prepare()方法进行初始化操作。如果在Looper.loop()方法之前没有调用Looper.prepare()方法,将会抛出异常:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { //处理消息逻辑 } }; Looper.prepare(); mHandler.sendEmptyMessage(0); Looper.loop();
四、looper.prepare 可以更新UI
在Android中,UI线程是通过一个消息循环机制来进行异步消息的处理。调用Looper.prepare()方法可以为当前线程创建一个消息队列,如果我们需要在UI线程中进行异步操作,就需要使用到消息循环机制,这就需要在UI线程中调用Looper.prepare()方法。
Looper.prepare()方法可以在UI线程中进行调用,因此我们可以在UI线程中使用该方法进行一些异步操作,例如更新UI和响应用户界面等等。但是需要注意的是,我们需要尽可能的保证UI线程不受阻塞,以便正常的UI更新操作能够被执行。
runOnUiThread(new Runnable() { @Override public void run() { Looper.prepare(); Toast.makeText(MainActivity.this, "UI Thread with Looper", Toast.LENGTH_SHORT).show(); Looper.loop(); } });
五、looper.prepare的选取
在实际应用中,我们需要根据自己的需求来决定是否使用Looper.prepare()方法。如果需要在UI线程中进行异步操作,我们就需要在UI线程中使用Looper.prepare()方法来创建一个消息队列。而在非UI线程中,我们可能需要手动使用Looper.prepare()方法来创建一个消息队列,以便在非UI线程中进行异步操作。
在使用Looper.prepare()方法的过程中,需要注意一些潜在的风险。例如,如果在UI线程中过度使用Looper.prepare()方法,就会导致UI线程被阻塞,影响用户的使用体验。此外,如果在非UI线程中使用Looper.prepare()方法,需要注意控制异步操作的频率,以便不会对系统造成过多的负担。