`

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中使用线程时应注意的关键点,这些点可以从提供的示例代码中提炼出来: 1. **线程与Activity通信**:Handler是Android中用于在主线程和工作线程之间传递消息的关键组件。在示例代码中,`...

    Android线程结束——合理的结束你想结束的线程

    它们在主线程中处理消息和回调,如果在工作线程中使用了Handler,记得在结束线程前关闭Looper,以防止内存泄漏和资源占用。 总结,结束Android线程时,关键在于优雅、安全地中断操作,而不是简单粗暴地停止。合理的...

    Android多线程文件上传

    在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...

    Android多线程操作

    因此,我们需要在Android中创建和管理多线程来解决这个问题。 一、线程类型 1. **标准Java线程**:可以使用`java.lang.Thread`类直接创建线程,通过重写`run()`方法实现线程任务。 2. **Handler/Looper/Message机制...

    Android多线程分段下载源码

    在Android开发中,多线程分段下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并优化用户体验。这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的...

    Android中AsyncTask实现多线程计数

    本篇将详细讲解如何在Android中使用AsyncTask实现多线程计数,并展示如何将计数结果显示到UI。 首先,我们需要理解Android的线程模型。Android应用的主要工作线程是主线程,也称为UI线程。这个线程负责绘制和交互UI...

    android多线程管理

    在Android开发中,多线程管理是至关重要的技术,它涉及到应用的性能、用户体验以及资源的有效利用。Android系统默认在主线程(UI线程)执行所有的用户交互,如果在这个线程中执行耗时操作,会导致应用程序无响应...

    从现实生活中理解android 线程消息机制

    值得注意的是,Android中并没有全局的消息队列,这意味着不同应用程序或线程之间不能直接通过Message Queue交换信息。每个Handler都有其独立的消息队列,只能处理属于自身线程的消息。例如,线程A的Handler可以发送...

    android多线程下载

    在实际开发中,可以使用Android的`DownloadManager`类,这是一个系统服务,提供了多线程下载、断点续传和自动处理网络错误等功能。但如果你需要更细粒度的控制,如自定义进度显示或更复杂的逻辑,可能需要自己实现...

    android 多线程下载机制

    2. **Android中的线程**:在Android系统中,主线程(UI线程)负责处理用户界面的交互和更新,而其他工作如网络请求、大文件读写等应该在后台线程进行,以避免阻塞主线程导致应用无响应。 3. **线程创建**:Android...

    Android多线程下载

    在Android应用开发中,多线程下载是一项关键技术,它能显著提高大文件下载的效率,尤其是在网络条件不稳定的情况下。断点续传是多线程下载的一个重要特性,允许用户中断下载后,从上次停止的位置继续,提高了用户...

    android 线程之间通过Handler发送消息

    首先,理解Android线程模型至关重要。Android应用的主要工作线程被称为UI线程或主线程,它负责处理用户界面的更新和事件响应。后台线程通常用于执行耗时任务,避免阻塞UI线程。为了在后台线程和主线程之间交换数据和...

    Android多线程文件夹下载及断点续传

    在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...

    android线程启动方法源代码

    本文将深入解析Android线程启动的方法,并通过源代码示例帮助初学者理解和掌握这一关键技能。 Android系统基于Java,因此其线程机制遵循Java的基本规则,但同时也有一些特定于Android平台的特性。在Android中,主要...

    Xamarin.Android 非UI线程更新UI

    总结起来,Xamarin.Android的非UI线程更新UI涉及了对Android线程模型的理解以及各种线程间通信技术的运用。通过Handler、RunOnUiThread、AsyncTask等方法,我们可以确保UI操作始终在主线程中安全执行。遵循最佳实践...

    如何在android的jni线程中实现回调

    首先,我们需要了解Android线程的基本概念。主线程,也称为UI线程,负责处理用户界面的更新和事件处理。为了避免阻塞主线程导致应用无响应,我们可以使用工作线程或者异步任务来处理耗时操作。JNI线程就是一种工作...

    android之子线程Thread

    在Android开发中,使用子线程处理图片是常见的优化手段,因为主线程(UI线程)负责用户界面的更新和事件响应,如果在主线程中进行耗时操作,如加载大图,会使得应用程序出现卡顿,严重影响用户体验。本篇文章将深入...

    Android定时器和线程实现

    在提供的`ThreadDemo`示例中,可能包含了如何在Android中使用线程和定时器的具体代码实现,这将有助于加深对这两个概念的理解。通过分析和学习这个示例,你可以更好地掌握在实际项目中如何运用这些技术。记得实践是...

    android 多线程 looper handler

    例如,我们可以在子线程中使用 Looper.prepare() 方法来准备消息队列,然后使用 Looper.loop() 方法来启动消息循环。在子线程中,我们可以使用 Handler 来发送和处理消息。 需要注意的是,在 Android 中,子线程不...

    android多线程异步下载图片

    在Android开发中,多线程异步下载图片是一项常见的需求,尤其在开发涉及大量图片展示的应用时,如社交应用、电商应用等。这样的技术能够提高用户体验,避免UI卡顿,因为图片加载工作不会阻塞主线程。下面我们将深入...

Global site tag (gtag.js) - Google Analytics