android startanimation 回调,ScheduledThreadPoolExecutor执行莫名停止问题Android几个动画回调运行线程...

本文记录两个问题:

ScheduleThreadPoolExecutor莫名停止执行。Animation和Animator两个动画回调监听 运行在哪个线程。

一:ScheduleThreadPoolExecutor问题:

ScheduledThreadPoolExecutor中scheduleWithFixedDelay(command, initialDelay, delay, unit)这个方法。我们会实现command这个Runnable参数。

问题:

当我们实现run()方法时,如果run()方法内运行时报错,那么ScheduleThreadPoolExecutor会自动停止,并且app不会崩溃,logcat也不会打印错误日志。。。

解决方法:

在api中也介绍了,如果希望executor继续运行下去,那么就必须将报错try catch掉。否则报错线程池将停止继续运行。

二:Animation和Animator两个动画回调监听 运行在哪个线程:

setAnimationListener(new ...{

onAnimationStart()

onAnimationRepeat()

onAnimationEnd()

})

1.Animation:View动画

先找到这个回调调用的地方:在Animation类中,源码:

/**

* Sets the handler used to invoke listeners.

*

* @hide

*/

public void setListenerHandler(Handler handler) {

if (mListenerHandler == null) {

mOnStart = new Runnable() {

public void run() {

if (mListener != null) {

mListener.onAnimationStart(Animation.this);

}

}

};

mOnRepeat = new Runnable() {

public void run() {

if (mListener != null) {

mListener.onAnimationRepeat(Animation.this);

}

}

};

mOnEnd = new Runnable() {

public void run() {

if (mListener != null) {

mListener.onAnimationEnd(Animation.this);

}

}

};

}

mListenerHandler = handler;

}可以看见回调方法被放到了Runnable里,那么讲道理,这个会通过handler处理。那么就找mOnStart。。这几个参数在哪里被调用了:

private void fireAnimationStart() {

if (mListener != null) {

if (mListenerHandler == null) mListener.onAnimationStart(this);

else mListenerHandler.postAtFrontOfQueue(mOnStart);

}

}

恩,将Runnable传递给mListenerHanlder去处理了。那么mListenerHandler这个handler在哪里被赋值的呢?哦。。在上面方法最后mListenerHandler = handler;

最后找到,在View类中:其中有一句代码:

if (mAttachInfo != null) a.setListenerHandler(mAttachInfo.mHandler);

A Handler supplied by a view's {@link android.view.ViewRootImpl}. This handler can be used to pump events in the UI events queue.

这是AttachInfo类中mHandler的注释。可以看到是管UI的handler。那肯定是在主线程中执行回调方法了。

结论:Animation回调方法一定是在主线程中了。

2.Animator:属性动画ValueAnimator等

同样,看listener在源码哪里被调用了:

private void notifyStartListeners() {

if (mListeners != null && !mStartListenersCalled) {

ArrayList tmpListeners =

(ArrayList) mListeners.clone();

int numListeners = tmpListeners.size();

for (int i = 0; i < numListeners; ++i) {

tmpListeners.get(i).onAnimationStart(this);

}

}

mStartListenersCalled = true;

}private void start(boolean playBackwards) {

if (Looper.myLooper() == null) {

throw new AndroidRuntimeException("Animators may only be run on Looper threads");

}

...

if (mStartDelay == 0) {

...

notifyStartListeners();

}

animationHandler.start();

}       Animator的start()会调用上面start(boolean)方法,调用notifyStartListeners()方法。这么看来,意思是Animator.start()方法在哪个线程里执行,回调就在哪个线程中。一会儿咱们测试一下是不是。注意上面一句代码:AndroidRuntimeException("Animators may only be run on Looper threads");看来Animator是可以在子线程中运行,但是该线程必须有looper!好咧,搞个代码测试下!

final ValueAnimator va = ObjectAnimator.ofFloat(0, 1);

va.setDuration(5000);

va.addUpdateListener(new AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

Log.e("TAG", "onAnimationUpdate"

+ Thread.currentThread().getName());

// start在什么线程回调就在什么线程

}

});

va.addListener(new AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

Log.e("TAG", "onAnimationStart"

+ Thread.currentThread().getName());

}

@Override

public void onAnimationRepeat(Animator animation) {

Log.e("TAG", "onAnimationRepeat"

+ Thread.currentThread().getName());

}

@Override

public void onAnimationEnd(Animator animation) {

Log.e("TAG", "onAnimationEnd"

+ Thread.currentThread().getName());

}

@Override

public void onAnimationCancel(Animator animation) {

Log.e("TAG", "onAnimationCancel"

+ Thread.currentThread().getName());

}

});

//va.start(); new Thread("hah") {public void run() {Looper.prepare();va.start();Looper.loop();};}.start();

上面代码测试后,结果果然是当start()在主线程中调用,那么回调方法全部都在主线程。如果在“hah”这个子线程中调用,那么回调方法都在“hah”子线程中。

结论:Animator的start()方法在哪个线程中调用,回调就在哪个线程中。注意:子线程需要有looper。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java future用法_纯干货:Java学习过程中的21个知识点和技术点

我们在Java学习过程中要学会抓重点&#xff0c;善于总结&#xff0c;Java学习过程中常见的21个知识点和技术点你知道吗&#xff1f;下面和千锋广州小编一起来看看吧&#xff01;1. JVM相关对于刚刚接触Java的人来说&#xff0c;JVM相关的知识不一定需要理解很深&#xff0c;对此…

zz测试接口_使用FizzBu​​zz和JUnitParams进行单元测试

zz测试接口我有时使用FizzBu​​zz向新手演示单元测试的基础。 尽管FizzBu​​zz确实是一个简单的问题&#xff0c;但它也可以用于演示更高级的单元测试技术&#xff0c;例如实现参数化测试。 FizzBu​​zz的可能解决方案之一是&#xff1a; public class FizzBuzz {private …

如何优雅地检测类型/表达式有效性?

注1&#xff1a;本文至少需要编译器支持C 11。注2&#xff1a;本文不考虑使用宏。一、老办法在写C 的时候&#xff0c;有时候可能需要检查一个类是否有特定的成员类型&#xff0c;例如&#xff1a;// 检查 T::type 是否存在&#xff0c;存在则 value 为 true&#xff0c;否则为…

html的页面宽高变形问题,CSS+div 设计的网页在不同浏览器中变形的问题

给别人做了一个web&#xff0c;自己这边正常&#xff0c;一到对方&#xff0c;机器上&#xff0c;发现变形了&#xff0c;真郁闷&#xff0c;后来才发现时IE7.0惹得祸&#xff0c;没有办法&#xff0c;学习呗。如何使网页在IE7.0和火狐中不变形&#xff1f;以下的方法可行&…

python爬虫开发 从入门到实战_python网络爬虫从入门到实战开发

1、简单的抓取网页 from urllib import request reqrequest.Request("http://www.baidu.com") responserequest.urlopen(req) htmlresponse.read() htmlhtml.decode("utf-8") print(html) 2、这里补充点Post和Get提交数据的差别 如果使用POST提交表单数据&…

swagger api文档_带有Swagger的Spring Rest API –公开文档

swagger api文档创建API文档后&#xff0c;将其提供给涉众很重要。 在理想情况下&#xff0c;此发布的文档将足够灵活以解决任何最后的更改&#xff0c;并且易于分发&#xff08;就成本以及完成此操作所需的时间而言&#xff09;。 为了使之成为可能&#xff0c;我们将利用我在…

html 页面重复度高,哪些情况容易造成重复页面

摘要在很多情况下我们明明没有发布重复页面&#xff0c;但为什么产生重复呢&#xff1f;下面我们一起来看看哪些情况容易造成重复页面&#xff1f;以及我们应该如何处理&#xff1f;abc.comabc.com/index.html在浏览器地址栏中输入这四个不同的URL链接&#xff0c;打在很多情况…

nuxt解决首屏加载慢问题_一个 Node 脚本让你的前端项目加载速度飞起来

写在最前面我的原创什么声明变成什么鬼了……前言随着前端三大框架的盛行&#xff0c;越来越多的前后端分离项目在服务器上跑了起来&#xff0c;随之而来&#xff0c;开发者也慢慢发现了这种开发模式所带来的弊端&#xff0c;其中之一就是首屏加载速度特别慢&#xff0c;因为虽…

数据库连接配置tomcat_Tomcat到Wildfly:配置数据库连接

数据库连接配置tomcat该摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xf…

左值、右值、左值引用、右值引用

【导读】&#xff1a;本文主要详细介绍了左值、右值、左值引用、右值引用以及move、完美转发。左值和右值左值&#xff08;left-values&#xff09;&#xff0c;缩写&#xff1a;lvalues右值&#xff08;right-values&#xff09;&#xff0c;缩写&#xff1a;rvalues直接上官网…

itex将html转成pdf加水印,itext操作PDF文件添加水印

功能描述&#xff1a;添加图片和文字水印/**** 【功能描述&#xff1a;添加图片和文字水印】 【功能详细描述&#xff1a;功能详细描述】* param srcFile 待加水印文件* param destFile 加水印后存放地址* param text 加水印的文本内容* param textWidth 文字横坐标* param tex…

wxpython界面切换_wxpython实现按钮切换界面的方法

本文实例为大家分享了wxpython按钮切换界面的具体实现代码&#xff0c;供大家参考&#xff0c;具体内容如下 #-*- coding:utf-8 -*- import wx class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u登陆,size(370,280),stylewx.MINIMIZE_BOX| wx.…

jboss 4.3.0_JBoss BPM Suite 6.0.3版本的5个实用技巧

jboss 4.3.0上周&#xff0c;红帽发布了JBoss BPM Suite的下一个版本&#xff0c;标记为6.0.3 &#xff0c;已订阅的用户可以在其客户门户中使用。 如果您对本发行版中的新增功能感到好奇&#xff0c;请在客户门户网站上在线查看发行说明和其余文档 。 我们正在寻找一些简单的…

C 条件变量使用详解

condition_variable介绍在C 11中&#xff0c;我们可以使用条件变量&#xff08;condition_variable&#xff09;实现多个线程间的同步操作&#xff1b;当条件不满足时&#xff0c;相关线程被一直阻塞&#xff0c;直到某种条件出现&#xff0c;这些线程才会被唤醒。其主要成员函…

HTML5新布局元素布局,HTML5新的布局元素

HTML5相对于HTML4新增了一些布局元素新增布局标签的优点&#xff1a;⒈更加注重文档的结构内容而不是以什么形式展现出来⒉对人的友好&#xff0c;更加语义化&#xff0c;增加代码的可读性⒊对计算机友好&#xff0c;浏览器更容易解析新增布局标签的内容&#xff1a;新增的布局…

pannel添加的子窗体很大_超简单的地瓜粉焖子做法全解,零失败

总以为做焖子是一项很大的工程&#xff0c;如果朋友知道你会做焖子定会用惊叹的语气崇拜你&#xff0c;想多一项厨艺吗&#xff0c;想让家人吃上自己亲手做的焖子吗&#xff1f;使用艺琳农场的地瓜粉一定让你出手不凡的&#xff0c;超简单&#xff0c;往下看哦新手为了担心霍霍…

swagger api文档_带有Swagger的Spring Rest API –创建文档

swagger api文档使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得很好&#xff0c;您也需要设置公司流程的权利以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻…

多线程队列的算法优化

【导读】&#xff1a;本文主要讲解多线程队列的优化。多线程队列&#xff08;Concurrent Queue&#xff09;的使用场合非常多&#xff0c;高性能服务器中的消息队列&#xff0c;并行算法中的Work Stealing等都离不开它。对于一个队列来说有两个最主要的动作&#xff1a;添加&am…

购买台式计算机方案,购买电脑的注意事项有哪些?

随着电脑的应用与普及&#xff0c;电脑已经逐渐成为人们学习、工作、生活中不可缺少的工具。同时&#xff0c;电脑的价格在逐渐下降&#xff0c;很多用户开始准备选购自己的电脑。选购电脑要考虑用户的需求、价格承受能力、商家服务质量等。1、明确用户需求购买电脑之前&#x…

linux 文件大小_整理 | Linux下列出目录内容命令

IT服务圈儿有温度、有态度的IT自媒体平台来源&#xff1a;良许Linux(ID&#xff1a;liangxuxiansheng)在 Linux 中&#xff0c;有非常多的命令可以让我们用来执行各种各样的任务。当我们想要像使用文件浏览器一样列出一个目录下的内容时&#xff0c;大家第一时间想到的是 ls 命…