`
dou_shini8820
  • 浏览: 80767 次
社区版块
存档分类
最新评论

AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动

 
阅读更多

在一些需求中,需要在程序运行时动画自动启动,我们也知道在android提供的Tween Animation和frame animation。但是当使用frame animation时候,启动Frame Animation动画的代码anim.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。现在问题是如何才能让程序启动时自动的启动动画?可以试一下在onStart方法中,但是结果同样不能如我们所愿。这样不行,继续尝试,使用Handler试一下!代码如下:

private Runnable runnable= new Runnable() { 
            public void run() { 
                frameAnimation.start(); 
            } 
            }; 
Handler handler=  new Handler(); 
//在onCreate方法中: 

handler.post(runnable);
  

 

handler对象将通过post方法,将里面的Runnable对象放到UI执行队列中,UI消费这个队列,调用Runnable的run方法。这里并不生成新的线程,此时的 Runnable 是运行在UI所在的主线程中。但是这种方法也是不行!

下面即是总结的三种自动启动frame animation的方法:

首先使用AsyncTask:Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。AsyncTask使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。对于AsyncTask这里就不多说了,也就是用到一点。

 

imageV.setBackgroundResource(R.anim.myframeanimation); 
        frameAnim = (AnimationDrawable) imageV.getBackground(); 
?class RunAnim extends AsyncTask<String, String, String>{ 
  
        @Override
        protected String doInBackground(String... params) {  
                if(!frameAnim.isRunning()){ 
                frameAnim.stop(); 
                frameAnim.start();   
                } 
            return ""; 
        } 
          
    } 
//onCreate方法中执行 
RunAnim runAnim=new RunAnim(); 
        runAnim.execute(""); 

 

这样就能在是程序自动执行frame animation了。

其次使用View.post(Runnable)的方式:

 

imageV.post(new Runnable(){ 
 
    @Override
    public void run() { 
        frameAnim.start(); 
    } 
      
}); 

 

文档:boolean android.view.View .post(Runnable action)

Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.即可把你的Runnable对象增加到UI线程中运行。

这样也能正常启动frame Animation。

第三就是使用ViewTreeObserver.OnPreDrawListener listener:当一个视图树将要绘制时产生事件,可以添加一个其事件处理函数:onPreDraw

 

OnPreDrawListener opdl=new OnPreDrawListener(){ 
        @Override
        public boolean onPreDraw() { 
            animDraw.start(); 
            return true; 
        } 
    }; 
  
//onCreate方法中 
imageV.getViewTreeObserver().addOnPreDrawListener(opdl); 

 

 

以上即是总结的三种自动启动frame animation的方法,当然,对于android线程的处理,UI更新操作实现,肯定有其他的方法。以上描述中如有错误,还望多多包含与指教!!!

分享到:
评论

相关推荐

    AsyncTask.java

    AsyncTask.java,AsyncTask.java,AsyncTask.java,AsyncTask.java

    AsyncTask.jar

    在这个"AsyncTask.jar"文件中,我们可以看到一个使用AsyncTask来下载网络图片的示例,即`AsyncTaskTest`。 AsyncTask分为三个基本步骤:`onPreExecute()`、`doInBackground(Params...)`和`onPostExecute(Result)`。...

    AsyncTask异步任务三.rar

    在Android应用开发中,异步任务(AsyncTask)是一个非常重要的组件,主要用于处理那些需要在后台线程执行但又需要与UI交互的操作。AsyncTask使开发者能够轻松地在后台线程执行耗时操作,然后在主线程更新UI,避免了...

    Edu_AsyncTask.zip

    在"Edu_AsyncTask.zip"项目中,开发者可能比较了这两种方式在加载图片时的性能、资源占用和用户体验。通过实际案例,学习者可以更好地理解和选择适合的异步处理方式。 总的来说,理解和熟练运用`AsyncTask`以及`...

    android中AsyncTask的用法

    首先,AsyncTask有三个泛型参数:Params、Progress和Result。Params代表启动任务时所需的输入参数,通常用于传递执行任务所需的初始数据。Progress表示任务执行过程中的进度信息,适合于展示进度条等进度反馈。...

    Android线程中操作UI界面的方法

    本文将详细介绍四种常见的在Android线程中操作UI界面的方法:使用Handler、View.post(Runnable)、Activity.runOnUiThread(Runnable)以及AsyncTask。 ### 1. 使用Handler **原理**: `Handler`机制是Android中处理...

    Android中AsyncTask与handler用法实例分析

    此外,还有其他几种与UI线程交互的方法,如`Activity.runOnUiThread(Runnable)`和`View.post(Runnable)`,它们都是将代码放入UI线程的消息队列,等待UI线程执行。`View.postDelayed(Runnable, long)`与`post()`类似...

    Handler与AsyncTask使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个非常重要的概念,它们主要用于处理应用程序的异步操作和线程通信。本文将深入探讨这些知识点,并通过实例来展示它们如何协同工作。 首先,`Handler`是...

    安卓拍照上传录像监控录屏相关-android录音上传到服务器上传使用AsyncTask异步任务.rar

    总结,这个压缩包提供的资源涵盖了Android平台上拍照、录像、录屏的实现方式,以及使用AsyncTask进行后台文件上传的基本步骤。在实际开发中,开发者需要结合具体需求,对代码进行适当的修改和优化,以确保功能的稳定...

    Android学习笔记(三二):线程:后台异步任务AsyncTask.doc

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制,它简化了在主线程和工作线程之间交互的过程。在Android中,由于UI操作必须在主线程中进行,因此需要异步处理来避免阻塞用户界面。AsyncTask就是...

    android录音上传到服务器,上传使用AsyncTask异步任务.zip

    - **外部存储**:Android设备通常有两种存储方式,内部存储和外部存储。录音文件通常保存在外部存储,因为它们可能需要在应用卸载后仍然存在。使用`getExternalFilesDir()`或`getExternalCacheDir()`方法可以获取...

    AsyncTask 源码解析.pdf

    Handler 常用来多线程之间传递消息,AsyncTask 内部实现 InternalHandler,用来发送和处理消息 MESSAGE_POST_RESULT、MESSAGE_POST_PROGRESS,对应 AsyncTask 的回调方法 onProgressUpdate 和 onPostExecute,这两个...

    AsyncTaskTest

    `AsyncTask` 类包含三个泛型类型参数,分别代表`Params`(输入参数)、`Progress`(后台执行过程中的进度)和`Result`(后台操作完成后返回的结果)。`AsyncTask` 提供了四个关键方法:`onPreExecute()`、`...

    Handler与AsyncTask共2页.pdf.zip

    在Android开发中,`Handler`和`AsyncTask`是两种常用的方式来处理应用程序中的异步操作。它们都是为了在主线程和工作线程之间传递数据、更新UI,避免阻塞主线程,提供良好的用户体验。让我们深入了解一下这两个关键...

    AsyncTask.rar

    为了在低版本设备上保持一致的行为,你可能需要使用`AsyncTask.executeOnExecutor()`方法指定`THREAD_POOL_EXECUTOR`。 6. **限制** 由于`AsyncTask`的设计,同一时间只能有固定数量的任务执行。因此,不适合大量...

    异步任务AsyncTask

    在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,尤其是在主线程中需要执行网络请求、数据库操作或大型数据处理时。它能够避免UI线程被阻塞,提供更好的用户体验。让我们深入了解一下`...

    在Android中使用AsyncTask和Handler线程间交互的方式

    在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    AsyncTask类实例详解

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制。它通过封装了线程管理和与主线程的交互,简化了在UI线程中处理异步任务的流程。下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 ...

Global site tag (gtag.js) - Google Analytics