`
zhuxinzx
  • 浏览: 293736 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android Handler的使用yu应该注意的问题

 
阅读更多

 

@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRunnable);
    super.onDestroy();
}

 Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.

首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示:

package com.android.tutor;
 
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
 
public class HandlerDemo extends Activity {
    // title为setTitle方法提供变量,这里为了方便我设置成了int型
    private int title = 0;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 1, 5000);
    }
 
    private class MyTask extends TimerTask {
        @Override
        public void run() {
 
            setTitle("Welcome to Mr Wei's blog " + title);
            title++;
        }
    }
}

 然而当我们执行程序,并不能达到我们预期的效果,所以Android引进了Handler这个特殊的类,可以说它是Runnable和Activity交互的桥梁,所以我们只要在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。

所以我们修改后的代码如下:

package com.android.tutor;
 
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
 
public class HandlerDemo extends Activity {
 
    // title为setTitle方法提供变量,这里为了方便我设置成了int型
    private int title = 0;
 
    private Handler mHandler = new Handler() {
 
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                updateTitle();
                break;
            }
        };
    };
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 1, 5000);
    }
 
    private class MyTask extends TimerTask {
        @Override
        public void run() {
 
            Message message = new Message();
            message.what = 1;
            mHandler.sendMessage(message);
 
        }
    }
 
    public void updateTitle() {
 
        setTitle("Welcome to Mr Wei's blog " + title);
        title++;
    }
}

 

 

 

 

 

--------------------------------------------应该注意的问题---------------------------------------------

 

 

 

 

我们都知道Hanlder是线程与Activity通信的桥梁,我们在开发好多应用中会用到线程,有些人处理不当,会导致当程序结束时,线程并没有被销毁,而是一直在后台运行着,当我们重新启动应用时,又会重新启动一个线程,周而复始,你启动应用次数越多,开启的线程数就越多,你的机器就会变得越慢。

为了方便大家理解,我写一个简单的Demo.功能就是每2秒中将应用的Title更换一次。具体步骤如下:

第一步:新建一个Android工程命名为ThreadDemo

第二步:修改ThreadDemo.java,代码如下:

package com.tutor.thread;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
 
public class ThreadDemo extends Activity {
    private static final String TAG = "ThreadDemo";
    private int count = 0;
    private Handler mHandler = new Handler();
 
    private Runnable mRunnable = new Runnable() {
 
        public void run() {
            // 为了方便 查看,我们用Log打印出来
            Log.e(TAG, Thread.currentThread().getName() + " " + count);
            count++;
            setTitle("" + count);
            // 每2秒执行一次
            mHandler.postDelayed(mRunnable, 2000);
        }
 
    };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 通过Handler启动线程
        mHandler.post(mRunnable);
    }
 
}

 第三步:运行上述工程,查看运行效果:

当然上面不是重点,退出应用时,线程还在跑,打开Logcat视窗或者cmd终端查看,如下(刚吃了午餐回来,线程还在跑着):

当我们再次启动应用时,会重新启动一个新的线程,如下图所示:

 

所以我们在应用退出时,要将线程销毁,我们只要在Activity中的,onDestory()方法处理一下就OK了,如下代码所示:

 

 

 所以ThreadDemo.java的完整代码如下:

 

 

 

package com.tutor.thread;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
 
public class ThreadDemo extends Activity {
    private static final String TAG = "ThreadDemo";
    private int count = 0;
    private Handler mHandler = new Handler();
 
    private Runnable mRunnable = new Runnable() {
 
        public void run() {
            // 为了方便 查看,我们用Log打印出来
            Log.e(TAG, Thread.currentThread().getName() + " " + count);
            count++;
            setTitle("" + count);
            // 每2秒执行一次
            mHandler.postDelayed(mRunnable, 2000);
        }
 
    };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 通过Handler启动线程
        mHandler.post(mRunnable);
    }
 
    @Override
    protected void onDestroy() {
        // 将线程销毁掉
        mHandler.removeCallbacks(mRunnable);
        super.onDestroy();
    }
}

 

分享到:
评论

相关推荐

    模拟Android Handler机制Demo

    【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    androidHandler测试的demo

    通过分析这个`demo`,开发者可以更好地理解Android中的多线程通信机制,并学会在自己的项目中正确、有效地使用`Handler`、`Looper`进行线程间通信。这将有助于提高程序的响应性和用户体验,避免因UI操作不在主线程...

    Android的Handler使用方法总结

    Android的Handler使用方法总结,不错的文档,跟大家分享分享

    android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。

    它可以在Android主线程中执行任务,避免了在其他线程中更新UI的操作导致的线程安全问题。Handler主要有两个核心方法:`sendMessage`和`handleMessage`,用于发送和处理消息。但在实现延时任务时,我们通常会使用`...

    Android handler message奇怪用法详解

    1. **静态内部类与Handler**:为避免内存泄漏,可以使用静态内部类来创建Handler实例,这样即使外部Activity或Fragment被销毁,Handler也不会持有它们的引用。 2. **弱引用与Handler**:使用WeakReference包裹...

    android handler的一些测试

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程...在测试中,确保正确地初始化和使用`Handler`,并注意线程安全,可以避免许多潜在的问题。

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Android Handler传值的demo

    在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android_Handler详解(一)

    为了解决这个问题,我们通常将耗时操作放在后台线程,而使用Handler来通知主线程更新UI。 - **保持UI流畅**:通过Handler,后台线程可以异步执行任务,不会阻塞主线程,确保用户界面的流畅性。 - **同步更新UI**:...

    Android中handler的使用

    总结来说,Handler是Android中处理多线程和UI同步的核心工具,理解其工作原理和使用方法对于开发高效、稳定的Android应用至关重要。通过熟练掌握Handler,开发者可以更好地控制应用的执行流程,确保UI响应性和性能。...

    android 中Handler 的几种写法

    通过理解以上知识点,开发者可以灵活地在Android应用中使用`Handler`进行线程间通信,高效地处理异步任务和UI更新。在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程...

    android handler runnable使用实例(关键是内部run中停止)

    在Android应用开发中,Handler、Runnable和Looper是三个非常重要的组件,它们构成了Android的消息处理机制。这个机制使得UI线程可以非阻塞地处理来自其他线程的消息,从而避免了UI冻结,提升了用户体验。下面我们将...

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    Android中的Handler的具体用法

    本文将深入探讨`Handler`的工作原理、如何使用以及它在Android应用程序中的实际应用。 `Handler`机制是Android系统为了实现线程间通信而设计的一种模式,主要包含三部分:`Handler`、`Message`和`Looper`。`Handler...

    老罗android Handler综合练习 图文混排 服务器端源代码

    总结来说,这个压缩包文件提供了一个完整的Android应用开发练习案例,涵盖了Handler的使用、图文混排的实现以及服务器端的JSON、MySQL和JSP技术。对于初学者来说,这是一个很好的实践平台,能够帮助他们深入理解...

    【Android开发入门】Android线程之Handler

    本知识点将深入探讨Android中的Handler机制,它是Android异步处理和消息传递的核心工具,帮助开发者解决多线程环境下UI更新的问题。 一、Android线程基础 Android系统主要分为两个线程:主线程(UI线程)和工作线程...

    Android Handler模拟进度条更新

    本篇文章将深入探讨如何使用Android Handler来模拟进度条更新。 首先,理解Handler、Looper和Message的基本概念: 1. **Handler**:它是消息处理对象,负责发送和处理Message。在主线程中创建Handler实例后,它...

    Android Handler解析

    为了解决这个问题,Android提供了一种非阻塞的消息传递机制——Handler。 ## Handler基础概念 ### 什么是Handler? Handler是Android框架中的一个核心组件,它提供了一个非阻塞的消息传递机制。通过Handler,可以...

Global site tag (gtag.js) - Google Analytics