关于子线程创建handler和onNewIntent()

今天总结下项目中用到小知识点,以前也没注意过,今天就单独写个日志吧。

我们经常是在主线程中创建handler,创建的步骤也直接new一个就行,并没有注意在子线程中创建。

下面是概念:

1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的;
2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定;
3.Message:消息;
4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表;
5.Looper:消息循环,从MessageQueue中取出Message进行处理;
6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程.

上面就不说了,网上都是这个差不多。

主要是在子线程中,下面是代码

new Thread(new Runnable() { 
    @Override
    public void run() { 
      Looper.prepare()
      handler2 = new Handler(); 
      Looper.loop() 
    } 
  }).start();
主要是要先获得looper然后在获得handler这个顺序必须是这样,原因是子线程是没有默认的looper,在主线程中会默认给出。

下面是主线程中的源码,

public static void main(String[] args) { 
SamplingProfilerIntegration.start(); 
CloseGuard.setEnabled(false); 
Environment.initForCurrentUser(); 
EventLogger.setReporter(new EventLoggingReporter()); 
Process.setArgV0("<pre-initialized>"); 
Looper.prepareMainLooper(); 
ActivityThread thread = new ActivityThread(); 
thread.attach(false); 
if (sMainThreadHandler == null) { 
  sMainThreadHandler = thread.getHandler(); 
} 
AsyncTask.init(); 
if (false) { 
  Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); 
} 
Looper.loop(); 
throw new RuntimeException("Main thread loop unexpectedly exited"); 
} 
可以看到创建了looper,在第7行prepaerMainLooper(),下面给出源码

public static final void prepareMainLooper() { 
prepare(); 
setMainLooper(myLooper()); 
if (Process.supportsProcesses()) { 
  myLooper().mQueue.mQuitAllowed = false; 
} 
} 

如果子线程中没有先调用Looper.prepare().会报错:

Can't create handler inside thread that has not called Looper.prepare() 
因为没looper对象创建

---------------------------分割线-----------------------------

下面是关于onNewIntent的内容了。这里主要是结合四种activity的启动模式使用的。(启动模式就不列举了,网上太多)

例如:

你的activity启动模式为单一实例模式,当从其他的activity跳转到这个activity时候想通过intent传递数据的时候,想保证每次拿到的intent都是最新的,就要要再onNewIntent(Intent  in)中接收activity传递过来的intent,并调用setIntent(in)。

下面是比较全面的说明:

  onNewIntent()非常好用,Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。 
 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。 

下面是一则注意事项,也是来自其他文章

注意这句话:
Note that getIntent() still returns the original Intent. You can use setIntent(Intent) to update it to this new Intent.

所以最好是调用setIntent(intent),这样在使用getIntent()的时候就不会有问题了。

基本上就这些了吧。有问题欢迎反馈。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值