全面解析Android进阶面试常客之Handler,分析Android未来几年的发展前景

本文详细解析了Android中的Handler、Looper和ThreadLocal的关系,解释了Handler如何在多线程中发送和处理消息。同时,文章指出在主线程中使用Handler时,系统已调用Looper.prepareMainLooper(),并探讨了Android未来几年的发展前景,特别是移动开发领域的进步。
摘要由CSDN通过智能技术生成

“Can’t create handler inside thread that has not called Looper.prepare()”);

}

这里是通过Looper中的myLooper方法来获得Looper实例的,如果Looper为null的话就会抛异常,抛出的异常内容翻译过来就是

无法在未调用Looper.prepare()的线程内创建handler

从这句话中,我们可以知道,在调用Looper.myLooper()之前必须要先调用Looper.prepare()方法,现在来看下prepare方法中的内容,如下

/** Initialize the current thread as a looper.

  • This gives you a chance to create handlers that then reference

  • this looper, before actually starting the loop. Be sure to call

  • {@link #loop()} after calling this method, and end it by calling

  • {@link #quit()}.

*/

public static void prepare() {

prepare(true);

}

private static void prepare(boolean quitAllowed) {

if (sThreadLocal.get() != null) {

throw new RuntimeException(“Only one Looper may be created per thread”);

}

sThreadLocal.set(new Looper(quitAllowed));

}

从上面代码中可以看到,prepare()方法调用了prepare(boolean quitAllowed)方法,prepare(boolean quitAllowed) 方法中则是实例化了一个Looper,然后将Looper设置进sThreadLocal中,到了这里就有必要了解一下ThreadLocalle。

什么是ThreadLocal

ThreadLocal 为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

当使用ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

如果看完上面这段话还是搞不明白ThreadLocal有什么用,那么可以看下下面代码运行的结果,相信看下结果你就会明白ThreadLocal有什么作用了。

public class MainActivity extends AppCompatActivity {

private static final String TAG = “MainActivity”;

private ThreadLocal mThreadLocal = new ThreadLocal<>();

@SuppressLint(“HandlerLeak”)

private Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if (msg.what == 1) {

Log.d(TAG, "onCreate: "+mThreadLocal.get());

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mThreadLocal.set(5);

Thread1 thread1 = new Thread1();

thread1.start();

Thread2 thread2 = new Thread2();

thread2.start();

Thread3 thread3 = new Thread3();

thread3.start();

new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(2000);

mHandler.sendEmptyMessage(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

}

class Thread1 extends Thread {

@Override

public void run() {

super.run();

mThreadLocal.set(1);

Log.d(TAG, "mThreadLocal1: "+ mThreadLocal.get());

}

}

class Thread2 extends Thread {

@Override

public void run() {

super.run();

mThreadLocal.set(2);

Log.d(TAG, "mThreadLocal2: "+ mThreadLocal.get());

}

}

class Thread3 extends Thread {

@Override

public void run() {

super.run();

mThreadLocal.set(3);

Log.d(TAG, "mThreadLocal3: "+ mThreadLocal.get());

}

}

}

看下这段代码运行之后打印的log

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值