`

Android中使用线程应该注意的问题

阅读更多

我们都知道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); 
    } 
  
} 


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

 ThreadDemo

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

Logcat

 

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

cmd

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

 

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

 

所以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开发中,使用线程应该注意的问题.doc

    Android开发中,使用线程应该注意的问题

    浅谈Android中多线程切换的几种方法

    我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于...

    Android 多线程可断点续传上传文件至服务器Demo

    Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)

    Android 线程开发 开发实例

    在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们...

    Android开发--多线程下载加断点续传

    对于每一个线程利用一个DownloadInfo类来保存下载的信息,每次在下载过程中向数据库更新信息(我也有想过只在下载暂停时进行更新,但那样的话我们的进程被杀掉时信息就无法保存下来)。在进行下载之前去访问数据库...

    如何在线程中正确使用Toast显示提示信息

    但是,在线程中使用 Toast 时,需要注意一些重要的细节,否则可能会导致应用程序崩溃或出现其他不可预期的结果。本文将讲述在线程中正确使用 Toast 显示提示信息的方法。 首先,需要了解的是 Toast 的显示机制。...

    android多线程断点下载,源码+实例

    摘要:Java源码,Android源码,多线程,断点下载 android多线程断点下载,通过本Android下载实例,可了解到以下知识技巧:实时得到文件下载的长度,设置获取实体数据的范围、获取文件已下载文件长度、原始文件长度、...

    android 2.3以后的socket注意

    android2.3以后,socket的连接需要一个相应的类似网络线程的管理的方法

    Android多线程学习实例详解

    主要介绍了Android多线程,结合实例形式较为详细的分析了Android多线程的概念、使用方法与相关注意事项,需要的朋友可以参考下

    Android实现多线程下载图片的方法

    方法一、直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然...

    android 多任务的多线程断点续传的下载软件

    * ldown是一款跨平台多任务的多线程断点续传的下载软件, * 支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载;支持 Win、android、Linux系统。 * * 欢迎联系:3603233570@qq.com * 注意:演示...

    EventBus-android

    async:事件响应函数在另外一个异步线程中执行 该线程和发布线程 主线程相互独立 如果事件响应函数需要较长的时间来执行 则应该使用该模式 例如 网络访问等 需要注意的是 由于系统并行的限制 应该避免在同一时间触发...

    Android开发中Looper.prepare()和Looper.loop()

     Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper....

    Android中定时器Timer和TimerTask的启动,停止,暂停,继续等操作

    下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。 需要注意的问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...

    Android App在线程中创建handler的方法讲解

    主要介绍了Android App在线程中创建handler的方法讲解,文中同时讲解了handler和线程的关系以及使用Handler时一些需要注意的地方,需要的朋友可以参考下

    android4.0.3 多线程socket通信(客户端->服务器)

    android4.0以后的版本的socket编程与之前有一些差别,本例用...这些数据是客户端程序从手机根目录下的test.txt文件中读取的,所以导入时要特别注意你的手机的根目录下有没有test.txt文件,如果不存在将会报空指针异常。

    android开发揭秘PDF

    2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命...

    Android高级编程--源代码

    8.3.2 在工作(worker)线程中使用Toast 265 8.4 Notification简介 266 8.4.1 Notification Manager简介 267 8.4.2 创建Notification 267 8.4.3 触发Notification 268 8.4.4 向Earthquake Monitor中添加...

    java线程分析android project例子

    java线程分析android project例子,主要分析了sleep(),join(),yield()和wait()以及notify等方法以及需要注意的事项。

    Android实战开发租赁管理软件(适配UI,数据的存储,多线程下载)

    在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点。通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化。...

Global site tag (gtag.js) - Google Analytics