我们都知道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了,如下代码所示:
@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中使用线程时应注意的关键点,这些点可以从提供的示例代码中提炼出来: 1. **线程与Activity通信**:Handler是Android中用于在主线程和工作线程之间传递消息的关键组件。在示例代码中,`...
它们在主线程中处理消息和回调,如果在工作线程中使用了Handler,记得在结束线程前关闭Looper,以防止内存泄漏和资源占用。 总结,结束Android线程时,关键在于优雅、安全地中断操作,而不是简单粗暴地停止。合理的...
在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...
因此,我们需要在Android中创建和管理多线程来解决这个问题。 一、线程类型 1. **标准Java线程**:可以使用`java.lang.Thread`类直接创建线程,通过重写`run()`方法实现线程任务。 2. **Handler/Looper/Message机制...
在Android开发中,多线程分段下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并优化用户体验。这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的...
本篇将详细讲解如何在Android中使用AsyncTask实现多线程计数,并展示如何将计数结果显示到UI。 首先,我们需要理解Android的线程模型。Android应用的主要工作线程是主线程,也称为UI线程。这个线程负责绘制和交互UI...
在Android开发中,多线程管理是至关重要的技术,它涉及到应用的性能、用户体验以及资源的有效利用。Android系统默认在主线程(UI线程)执行所有的用户交互,如果在这个线程中执行耗时操作,会导致应用程序无响应...
值得注意的是,Android中并没有全局的消息队列,这意味着不同应用程序或线程之间不能直接通过Message Queue交换信息。每个Handler都有其独立的消息队列,只能处理属于自身线程的消息。例如,线程A的Handler可以发送...
在实际开发中,可以使用Android的`DownloadManager`类,这是一个系统服务,提供了多线程下载、断点续传和自动处理网络错误等功能。但如果你需要更细粒度的控制,如自定义进度显示或更复杂的逻辑,可能需要自己实现...
2. **Android中的线程**:在Android系统中,主线程(UI线程)负责处理用户界面的交互和更新,而其他工作如网络请求、大文件读写等应该在后台线程进行,以避免阻塞主线程导致应用无响应。 3. **线程创建**:Android...
在Android应用开发中,多线程下载是一项关键技术,它能显著提高大文件下载的效率,尤其是在网络条件不稳定的情况下。断点续传是多线程下载的一个重要特性,允许用户中断下载后,从上次停止的位置继续,提高了用户...
首先,理解Android线程模型至关重要。Android应用的主要工作线程被称为UI线程或主线程,它负责处理用户界面的更新和事件响应。后台线程通常用于执行耗时任务,避免阻塞UI线程。为了在后台线程和主线程之间交换数据和...
在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...
本文将深入解析Android线程启动的方法,并通过源代码示例帮助初学者理解和掌握这一关键技能。 Android系统基于Java,因此其线程机制遵循Java的基本规则,但同时也有一些特定于Android平台的特性。在Android中,主要...
总结起来,Xamarin.Android的非UI线程更新UI涉及了对Android线程模型的理解以及各种线程间通信技术的运用。通过Handler、RunOnUiThread、AsyncTask等方法,我们可以确保UI操作始终在主线程中安全执行。遵循最佳实践...
首先,我们需要了解Android线程的基本概念。主线程,也称为UI线程,负责处理用户界面的更新和事件处理。为了避免阻塞主线程导致应用无响应,我们可以使用工作线程或者异步任务来处理耗时操作。JNI线程就是一种工作...
在Android开发中,使用子线程处理图片是常见的优化手段,因为主线程(UI线程)负责用户界面的更新和事件响应,如果在主线程中进行耗时操作,如加载大图,会使得应用程序出现卡顿,严重影响用户体验。本篇文章将深入...
在提供的`ThreadDemo`示例中,可能包含了如何在Android中使用线程和定时器的具体代码实现,这将有助于加深对这两个概念的理解。通过分析和学习这个示例,你可以更好地掌握在实际项目中如何运用这些技术。记得实践是...
例如,我们可以在子线程中使用 Looper.prepare() 方法来准备消息队列,然后使用 Looper.loop() 方法来启动消息循环。在子线程中,我们可以使用 Handler 来发送和处理消息。 需要注意的是,在 Android 中,子线程不...
在Android开发中,多线程异步下载图片是一项常见的需求,尤其在开发涉及大量图片展示的应用时,如社交应用、电商应用等。这样的技术能够提高用户体验,避免UI卡顿,因为图片加载工作不会阻塞主线程。下面我们将深入...