`
java_cofi
  • 浏览: 47522 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android线程的创建与销毁

阅读更多
ndroid线程的创建与销毁

在Android开发中经常会使用到线程,一想到线程,很多同学就立即使用

new Thread(){...}.start();
这样的方式。这样如果在一个Activity中多次调用上面的代码,那么将创建多个匿名线程,程序运行的越久可能会越来越慢。因此,需要一个Handler来启动一个线程,以及删除一个线程。
保证线程不会重复的创建。

1、创建Handler的一般方式
一般会使用

Handler handler = new Handler(){...};
创建。这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的。Looper是用于实现消息队列和消息循环机制的。
因此,如果是默认创建Handler那么如果线程是做一些耗时操作如网络获取数据等操作,这样创建Handler是不行的。

2、使用HandlerThread

HandlerThread实际上就一个Thread,只不过它比普通的Thread多了一个Looper。我们可以使用下面的例子创建Handler
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
mHandler = new Handler(thread.getLooper());
mHandler.post(mBackgroundRunnable);
创建HandlerThread时要把它启动了,即调用start()方法。然后创建Handler时将HandlerThread中的looper对象传入。那么这个mHandler对象就是与HandlerThread这个线程绑定了(这时
就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)。
最后把实现耗时操作的线程post到mHandler的消息队列里面。注意的是,mBackgroundRunnable这个线程并没有启动,因为没有调用start()方法。

3、完整的angrycode

public class MainActivity extends Activity implements OnClickListener{
public static final String TAG = "MainActivity";

private Handler mHandler;

private boolean mRunning = false;

private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();//创建一个HandlerThread并启动它
mHandler = new Handler(thread.getLooper());//使用HandlerThread的looper对象创建Handler,如果使用默认的构造方法,很有可能阻塞UI线程
mHandler.post(mBackgroundRunnable);//将线程post到Handler中

mBtn = (Button)findViewById(R.id.button);
mBtn.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
mRunning = true;
}
@Override
protected void onStop() {
super.onStop();
mRunning = false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//实现耗时操作的线程
Runnable mBackgroundRunnable = new Runnable() {

@Override
public void run() {
//----------模拟耗时的操作,开始---------------
while(mRunning){

Log.i(TAG, "thread running!");

try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//----------模拟耗时的操作,结束---------------
}
};
@Override
protected void onDestroy() {
super.onDestroy();
//销毁线程
mHandler.removeCallbacks(mBackgroundRunnable);

}
@Override
public void onClick(View v) {
Toast.makeText(getApplication(), "click the button!!!", Toast.LENGTH_SHORT).show();
}
}
上面的angrycode中,如果在onCreate()方法中里面没有使用HandlerThread而是在直接使用Handler的默认构造方法来创建Handler,那么mBackgroundRunnable将会阻塞UI线程。

4、线程销毁
用上面的方式来创建线程,在销毁时就可以使用

mHandler.removeCallbacks(mBackgroundRunnable);
销毁一个线程,这样就可以避免在多次进入同一个Activity时创建多个同时运行着的线程。

原文:http://angrycode.cn/archives/447
分享到:
评论

相关推荐

    Android下的多线程

    在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数,一般都是一个带有循环的函数,来处理某些数据,优先线程只 是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。...

    Android代码-AppUninstall

    Java线程轮询,监听/data/data/{package-name}目录是否存在:卸载app,进程退出,线程也被销毁。 C进程轮询,监听/data/data/{package-name}目录是否存在:目前业界普遍采用的方案。 原理 从前四种方案可以看到,...

    Android实例HandlerThread源码分析

    然而,这样就存在一个性能问题:多次创建和销毁线程是很耗 系统资源的。为了解这种问题,我们可以自己构建一个循环线程Looper Thread,当有耗时任务投放到该循环线程中时,线程执行耗 时任务,执行完之后循环线程...

    《Android系统源代码情景分析》

    第15章 Android应用程序线程的消息循环模型 15.1 应用程序主线程消息循环模型 15.2 与界面无关的应用程序子线程消息循环模型 15.3 与界面相关的应用程序子线程消息循环模型 第16章 Android应用程序的安装和...

    Android系统源代码情景分析-罗升阳-源码

    第15章 Android应用程序线程的消息循环模型 15.1 应用程序主线程消息循环模型 15.2 与界面无关的应用程序子线程消息循环模型 15.3 与界面相关的应用程序子线程消息循环模型 第16章 Android应用程序的安装和显示...

    android自定义短信倒计时view

    为了保证activity销毁的同时倒计时线程依然进行同时重新创建销毁又不会导致内存泄漏,我使用了handler的弱引用将handler和runnable设置成静态,同时通过一系列变量来销毁关闭线程保存状态,话不多说先看效果图: ...

    android 面试2

     答:Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列  Handler:可以发布或者处理一个消息或者操作一个Runnable,通过...

    ObjectPool:Android 对象池

    Android 对象池 谨慎和智能地使用系统资源对 ... 对象池使对象生命周期复杂化,因为此时从池中获取和返回的对象实际上并未创建或销毁,因此在实现时需要小心。 用法 在里面 创建ObjectPool来托管对象。 对象池提供了两

    Android系统源代码情景分析光盘

    Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................

    Android自定义短信倒计时view流程分析

    为了保证activity销毁的同时倒计时线程依然进行同时重新创建销毁又不会导致内存泄漏,我使用了handler的弱引用将handler和runnable设置成静态,同时通过一系列变量来销毁关闭线程保存状态,话不多说先看效果图: ...

    Android开发资料合集-World版!

    1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 1.2、ANDROID应用程序架构 9 2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 2.1.1、概述 12 2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 ...

    Andriod Service与Thread的区别介绍

    这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就...

    Android 开发技巧

    1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 1.2、ANDROID应用程序架构 9 2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 2.1.1、概述 12 2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 ...

    Android实现简单的文件下载与上传

    * 1>当第一次启动IntentService时,Android容器 * 将会创建IntentService对象。 * 2>IntentService将会在工作线程中轮循消息队列, * 执行每个消息对象中的业务逻辑。 * 3>如果消息队列中依然有消息,则继续...

    android特卖列表倒计时卡顿问题的解决方法

    由于滑动的时候,adapter的getView频繁的创建和销毁,就会出现卡顿和数据错位问题,那么我们每一个item的倒计时就需要单独维护,这里我用的Handler与timer及TimerTask结合的方法,我们知道TimerTask运行在自己子线程,...

    Android App监听自身卸载反馈统计

    Java 线程轮询,监听/data/data/{package-name}目录是否存在:卸载 app,进程退出,线程也被销毁。C 进程轮询,监听/data/data/{package-name}目录是否存在:目前业界普遍采用的方案。原理从前四种方案可以看到,...

    Android性能优化典范(下)

    例如,最近刚分配的对象会放在YoungGeneration区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比OldGeneration区域的GC操作速度更快的。除了速度差异之外,执行GC操作...

    史诗:适用于Android的动态Java方法AOP挂钩(ART上的Dexposed的延续),支持5.0〜11

    它是什么? 史诗是在ART上的延续(支持 )。 基于开源项目的工作,Dexposed是一个功能强大且非侵入性的运行时框架,用于Android应用程序开发。... 示例1:监视Java线程的创建和销毁 class ThreadMethodHook

Global site tag (gtag.js) - Google Analytics