Android中Activity处理Handler消息时,frame-animation会卡顿

项目中要实现一个UI,要有进度滚动的动画以及步骤更新。
进度滚动的动画是采用帧动画的方式实现,步骤更新是采用的Handler机制进行更新。
UI是在主线程中的,在后台的service中调用Activity的handler进行msg发送,在Activity中根据接收到的msg进行步骤的更新处理。

现在的问题是,每次发送msg时,animation都会卡顿一下。开始是怀疑步骤更新的时候,对checkbox打钩影响的,现在把这部分代码注释掉后,同样会卡顿。有没有大神帮忙指导下,非常感谢!

Activity中接收msg处理如下:
case VdmcMsgHandler.MSG_TYPE_TASK_COMPLETE:{
// checkBox1.setVisibility(1);
// checkBox1.setChecked(true);
break;
}

service中发送msg如下:
NormalActivity.getInstance().handler.sendMessage(VdmcMsgHandler.MSG_TYPE_TASK_COMPLETE);

动画是放在onWindowFocusChanged中实现的:
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
Log.i(TAG, "onCreate");

setContentView(R.layout.taskactivity);

//check progress animation
animationImage = (ImageView)findViewById(R.id.hfaanimationimage);
}

public void onWindowFocusChanged(boolean hasFocus){
super.onWindowFocusChanged(hasFocus);
Log.i(TAG, "onWindowFocusChanged");

animationImage.setImageResource(R.drawable.animation);
animationDrawable = (AnimationDrawable) animationImage.getDrawable();
animationDrawable.start();
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在主线程的handler里开子线程 主线程会卡主
实现一个在2s双击返回键就退出程序的功能,将延迟放到了handler中。public void onBackPressed() { Log.i("isfinish",""+is_Finish); if(is_Finish == 0){ Toast.makeText(this,"再按一次返回键退出",Toast.LENGTH_SHORT).sho
一个activity中多个handler和消息的处理过程
Ø  能否有多个handler handler的构造方法 public Handler() {          …. mLooper = Looper.myLooper(); mQueue = mLooper.mQueue; mCallback = null; … }     因为几乎主要的成员变量都是从Looper中拿出来的,最初以为一个线程中只能有一个han
Android事件处理方法总结-Handler消息处理
Android Handler消息处理:4个主要参与对象(Handler 消息发送接收处理类 + Message消息对象 + MessageQuene消息队列 + Looper:每个线程只拥有一个Looper,以先进先出的方式负责从MessageQuene消息队列里面读取Message交由Handler处理);使用Handler的3个步骤(Ⅰ.主线程创建一个Handler,用于消息处理 + Ⅱ.子线程发送消息 + Ⅲ.主线程接收并处理消息)
Android Handler消息处理机制详解
前言 从我们学习android开始,几乎每天都在和handler打交道.有了它,我们在子线程中处理好了耗时的操作,可以利用它来更新UI.它为我们在线程间的通信提供了很大的方便,而今天博客就来详细的介绍一下Handler的消息循环机制,一步一步的了解其中的奥妙,本文不介绍Handler的详细使用,探究的是内部的原理.所以看这篇博客的童鞋需要有handler的基本使用能力 先抛出一个简单的
Android Activity卡顿原因总结
内存泄漏导致内存占用较高,导致JVM频繁触发GC。解决办法:尽可能的减少生命周期长的对象引用生命周期短的对象。导致内存泄漏的原因有一下几个: 1.查询数据库后没有关闭游标cursor,各种资源文件没有close。 2.构造Adapter时,没有使用convertView重用 3.Bitmap对象不再使用时没有调用recycle释放内存 4.静态变量引用对象
防止handler占用Activity,导致Activity无法按时回收
简述: 这种jvm无法及时回收avtivity的情况,源于有消息再队列中,handler无法回收,所以如果handler非静态的那么使用handler的Activity和Service就无法回收 转自 http://www.eoeandroid.com/thread-184245-1-1.html 的解决方法 package com.anialy.testproj.part1.act
解决DrawerLayout以及viewpager点击或者滑动后卡顿的问题
编写这个模仿知乎日报的App时主界面采用了DrawerLayout使左侧包含一个抽屉菜单,在阅读日报的界面采用viewpager保证可以左右滑动,这里遇到了一个同样的问题,就是在DrawerLayout点击后就会开始加载网络数据,同样viewpager滑动后也会开始加载网络数据,而加载网络数据时会阻塞一下主线程,到时抽屉菜单或阅读界面还没有完全滑动完成时就会卡一下,用户体验很不好,在这里需要引入个
android 中handler为什么不会阻塞主线程
handler在消息处理的时候用到了Looper.loop()方法ActivityThread程序的入口public static final void main(String[] args) { SamplingProfilerIntegration.start(); …… Looper.prepareMainLooper(); if
activity页面多次反复切换会变卡。
在AndroidMainfest页面里声明页面跳转是这样。               android:name="com.activity.Testupdate"             android:theme="@style/Transparent"                android:configChanges="keyboardHidden|orientation|
用handler发延时消息时最好设置设为static
一旦用handler发出延时的message,message会被保存在消息队列中,这段延时的时间,message会保持对handler的引用,导致handler无法被回收,使用handler的activity和service也无法被回收,即使onDestroy()方法被调用。 这种情况应该把handler类修饰为static,这样handler类就是activity的静态内部类,静态内部
一个Activity多个Handler时,Message是如何传递的
最近在面试,被面试官问到如果一个Activity有多个handler时候,怎样知道handler1发送的消息不会被handler2接收,同理handler2发送的消息不会被handler1接收。回来以后看源码才发现原来是这样的: 平时我们直接new Handler(),源码里面执行的是 /** * Default constructor associates this handler w
android activity刚打开时内部动画卡顿问题
最近遇到这个问题,一个activity中有一个imageview的旋转动画,当activity刚打开时,前几秒这个旋转的动画没有转动的过程,过了0.几秒以后直接卡到某个未知接着转.到处搜索都是说activity出现时的过渡动画的问题,感觉人类语言不足以精简的表达这种事情ORZ.Google后找到了这个文章 和 这个文章,大致就是说: It’s important to note that the
进入Activity、动画卡顿问题的解决方案
有时我们使用activity转场动画的时候,没有再demo流畅,原因可能是因为动画进行时,有同时加载数据等进行主线程操作,所以会导致动画不够流畅. 解决办法就是在动画结束后再进行数据加载等相关操作. activity里有一个方法/** * Activities cannot draw during the period that their windows are animating in.
使用Handler实现Activity和Service之间的交互
在开发应用的时候,我们有时候需要Service来处理后台任务。同时需要两者之间的实时交互,比如说下载的时候我们需要实时地更新Notification的下载进度。我们可以通过BroadcastReceiver来实现Service和Activity的交互,但是今天我们来介绍另外一种实现方法。使用Handler实现Activity和Service之间的交互。 实现的原理: 1.在Service中
关于handler在子线程中无法给activity传递信息的问题及解决办法
遇到一个问题,我在与服务器交互信息时,开启了另一个线程,并未这个线程(子线程)传入了handler,得到服务器返回的结果后,我开启了Looper,然后调用handler.sendMessage()想把message传回个主线程的activity,结果失败了,并没有传回到activity去: Looper.prepare(); Toa
安卓性能优化之清除Handler的Message和Runnable
Handler是由系统所提供的一种异步消息处理的常用方式,一般情况下不会发生内存泄露. 但既然是调优,当在A_Activity中使用handler发送了几个消息,然后又跳到B_Activity,这个时候如果我们想结束之前在A_Activity中发出的消息,不再占用多余的队列空间.怎么办呢? 原来,Handler中已经提供了一个removeCallbacksAndMessages ha
Handler实现Adapter和Activity之间的通信
具体做法如下:1 在Activity中定义一个handler2 然后把这个handler通过adapter构造方法参数传递给Adapter3在Adapter中向handler发消息FR:海涛高软(QQ技术群:386476712)
首次进入Activity、动画卡顿问题的解决方案
初步思路,等待Activity的转场动画完成后,再开始页面内的动画
Android: 如何利用Handler处理和发送消息来实现页面刷新的功能
Class Overview A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue.  Each Handler instance is associated with a single thread and that th
用handler在两个activity之间传递数据
资源包括如何在一个activity A里激活另一个activity B。 然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。
Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
 Android中为什么主线程不会因为Looper.loop()里的死循环卡死? app程序入口中为主线程准备好了消息队列 … 显示全部   分享   什么是答案总结? 答案总结 Handler 机制应该基本都知道了,题主点进去源码看下 ActivityThread 就能基本搞明白了,为什么主线程不
工作线程中利用handler向主线程发送消息
首先,可以先了解下线程间通信时Message,Handler,MessageQueue,Looper之间的关系解释下. Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再由Handler进行Message的分发和处理. Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一
activity启动卡顿问题
切换页面卡断问题 问题:由于项目需求经常变动,使用Activity包含Fragment来实现,在Activity的onCreate中创建加载Fragment。这种实现在性能差的手机上,启动新页面切换缓慢,经常出现用户点击按钮后,2-3s后才出现新页面。 分析:使用TraceView发现,在性能差的手机上,Fragment的创建添加操作需要耗时0.6s;考虑当前是在Activity的onCr
Android之在一个类里面注册Handler发送消息在另外一个类里面接收消息
1、问题 我们要在一个类里面变量或者函数变化需要改变另外一个类里面的东西,这个时候java里面除了接口回调之外,我们还可以用注册Handler来实现 2、代码实现 1、MainActivity.java文件 package com.example.handlercallback; import android.app.Activity; import androi
Android Handler 消息机制(解惑篇)
从源码的角度分析Android Handler 消息机制,以及分析ActivityThread中的消息处理机制和经典问题。
Handler延迟消息处理
MessageQueue,以队列的形式管理message,message先进先出,但其内部是采用单链表来存储消息列表。 post(Runnable r)、postDelayed(Runnabler, long delayMillis)、sendMessage(Message msg)、sendMessageDelayed(Message msg, long delayMillis)最终调用的
service使用handler与Activity沟通的两种方法
标签: 通过之前的学习,我们知道了在主线程中声明一个handler实例并实现了消息的处理方法之后,我可以在子线程中用此实例向主线程发消息,在处理方法中获取消息并更新UI。 那么,如果我们想用handler在service中向activity文件传递消息呢?在这里提供了两种方法 方法一: 在想接收消息的Activity中,把handler实例声明为静态的公用的,即 public static
在activity之间传递handler(一)
最近在研究基于安卓系统的语音识别和蓝牙通讯,过程中涉及到多个activity的交互。activity之间的交互数据可以由Intent完成,也可以借用Handler。如果用intent的话,一定要finish当前的activity UI,另一个activity响应,数据才得以传递,此时UI势必改变。而用handler是在一个activity中控制另一个activity活动的好方法。在activity之
在navigationView中切换/创建fragment时的卡顿优化
在我们的app界面中,经常会有这样的布局:mainActivity托管多个fragment,在navigationView的点击事件中处理fragment的切换逻辑,很简单也很实用。一看到这样的逻辑,我们首先就会想到,fragment之间的关系不能是replace,这样的话每次切换都会销毁并创建新的实例,影响切换时的体验,所以我们用hide和show来隐藏/显示他们。 但不可避免的是,即便我们使用
Activity中定义Handler有警告
思考下面代码 1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHandler = new Handler() { 4 @Override 5 public void handleMessage(Message msg) { 6 // ...
android 自定dialog,其中textview卡顿现象
今天自定义了一个dialog,来实现像系统的progressDialog的功能,布局什么都是小case了,会android的都会,那么现在就来说说遇到的这个卡顿现象。 因为这个dialog是用来显示下载的进度,并且显示时时的下载字节数,所以每次下载后,都会去更新textview的值,因为下载都是在子线程中执行的,所以更新textview只有采用handler或者runOnThread的方式去更
Andorid中Handler造成的内存泄漏浅析与处理
Handler机制是Android中提供的一个异步回调机制,我们可以在完成一个耗时任务后作出相应通知。 每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中 引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好 处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。
android 切换卡顿解决方法
如果想要让应用用户流畅的滑动体验的话,那么就必须对activity和fragment的生命周期有一个完整的概念以及在何种情况下会触发哪些事件。 在自己目前做的项目中,就遇到了这样的问题,那么就把自己的解决方法罗列,重点在于onpause,onstop,onstart,onresume的事件处理。 某些耗时的操作延迟加载,先展示总体页面。 当对某些复杂的页面进行切换时,先隐藏后显示,如
android通过Handler在线程之间传递消息
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。 demo:下载地址。 运行截图: 源码: package fk.androiddemo_005; //工作线程不能直接修改主线程的控件,只能通过handler传递信
android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler
遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新,没想到传递handler的方法,通过以下方式解决。 1.在MyAPP中定义属性handler package jason.com; import jason.com.MasterActivity.MyHandler; import android.app.Application; /** * 自己
Handler引起的内存泄露(Activity中Handler的正确使用方法)
如果你在Activity中定义了一个内部Handler类,如下代码: public class MainActivity extends Activity { private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {
android之Handle异步的消息回调机制
异步的消息回调机制,利用Handle来发送消息和处理消息(消息放于线程消息队列中) 应用场景一:android应用UI每隔10秒去请求web端接口,获取数据库message消息表中最新的“我的未读消息”记录数,并高亮显示在UI里 习惯了java编程,我们一开始会试图用下面的代码来刷新UI new Thread( new Runnable() { public void
Android---Handler消息处理机制
搞Android的人都知道,android是不允许你在子线程中更新UI操作的,这主要出于线程安全方面的考虑,通常的做法是在主线程中创建一个Handler对象,在子线程中创建一个Message对象,该Message对象中封装一些更新UI操作的数据,通过Handler的sendMessage方法发送出去,主线程利用Handler的handleMessage方法来对该Message进行相应的处理,但发现
详解Fragment跟Activity之间的通信 利用handler fragment和activity双向发送消息
不会用handler。找了几个文章学习大多数都是写的activity向fragment发送消息的例子,终于找到一个fragment向activity发送消息的,粘过来学习一下。 原文:http://blog.csdn.net/xiaoyuan511/article/details/38013277 转自:http://www.tuicool.com/articles/f6biyuZ 大家
【Android开发】消息处理类(Handler)与消息类(Message)介绍
一.消息处理类(Handler)简介 消息处理类Handler允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中。Handler主要有一下两个作用: 1.将Message或Runnable应用post()或sandMessage()方法发送到MessageQueue中,在发送时可以指定延迟时间、发送时间以及要携带的Bundle数据。当MessageQ
android Handler发送与处理消息小结
Looper处理消息的逻辑: 分发消息 for (;;) { Message msg = queue.next(); // might block msg.target.dispatchMessage(msg); msg.recycle(); } 处理消息 public void dispatchMessage(Message msg) { if (m
详解Android App卡顿优化问题
所谓app卡顿原因就是在运行时出现了丢帧,还可能是UI线程被阻塞。首先来一下丢帧现象,android每16ms会对界面进行一次渲染,如果app的绘制、计算等超过了16ms那么只能等下一个16ms才能进行渲染,这就发生了丢帧现象。 手机卡顿出现的原因: 1,布局过于复杂:xml布局文件可能存在深层嵌套或者组件过多; 2,重复绘制:一个界面的某一点可能在同一时间进行了多次绘制; 3,内存抖动:
Android--利用Handler消息转发机制实现倒计时(内含防止内存泄露处理)
真正学会Handler必须要了解的相关概念相关概念图示: Message:存储信息的对象,被Handler在线程间转发,实现线程间的通信。 MessageQueue:以有序的方式排列的,等待处理的事件(Runnable或者Message)。 Handler:本质上是生成了消息队列,供Lopper抽取。 Lopper:类似水泵,从MessageQueue抽取Runnable或者Messag
安卓事件处理---Handler消息处理机制
1、为什么要有handler机制? 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR(应用无响应)错误。所以就将这些操作放在子线程中,但是由于Android子线程是不安全的,所以只能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通
Android Handler类消息传递机制(三)不同类中使用Handler
Handler的关键,在不同类中使用需要注意参数的传递    分为两种情况 1.从其他类向activity类传送数据 下面以其他类和activity类通信交换数据为例讲解运行模式 /******************************************************************************************************
handler的执行顺序
主线程中的handler只会在子线程中数据获取完成之后才会执行,所以主线程中的handler不是按顺序执行的。 // 增加一个线程,来访问服务器 new Thread() { @Override public void run() { tr
activity退出,销毁线程
在Android开发中,经常会用到线程和Timer,如果没有主动关闭它们,当程序结束时,线程并没有被销毁,而是一直在后台运行着,当我们重新启动应用时,又会重新启动一个线程,周而复始,你启动应用次数越多,开启的线程数就越多,你的机器就会变得越慢。还会导致意想不到的错误。 1、线程的销毁 Hanlder是线程与Activity通信的桥梁,利用handler接收到任务线程,放到任务队列里面派对执行。
关于主线程阻塞导致界面卡顿问题总结
遇到的问题 一个界面里面执行了刷新和一个动画效果,当动画效果执行完之后会对界面进行重新绘制,这个时候会出现卡顿现象。 解决问题 经多次查看,问题不出在动画上,是动画执行完毕之后更新一个textView里的内容,这个textView宽高是wrapContent的,所以,当更新textView内容的时候会重新绘制textView的宽高,导致了主线程阻塞,出现卡顿。 解决方法:将此textView
Handler消息如何取消
handler发消息方式: 发送即时消息: Message msg = new Message(); msg.what = 100; handler.sendMessage(msg); 延时5秒发送消息: Message msg = new Message(); msg.what = 100; handler.sendMe
android 中invalidate()的自动清屏含义以及屏幕刷新
android 中invalidate()的自动清屏含义以及屏幕刷新 invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用 invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop 掉。 对于屏幕刷新有以下集中情况可以考虑: 1.不使用多线程和
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问