Android线程的创建与销毁

摘要:

  在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()方法。

完整demo:

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();
    }
} 

如果在onCreate()方法中里面没有使用HandlerThread而是在直接使用Handler的默认构造方法来创建Handler,那么mBackgroundRunnable将会阻塞UI线程。

 3、线程销毁 

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

mHandler.removeCallbacks(mBackgroundRunnable); 

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

原文:

Android线程的创建与销毁[2014-07-11](2013-06-19).http://www.bdqn.cn/news/201306/9538.shtml

Android线程的创建与销毁

时间: 2024-10-01 04:00:49

Android线程的创建与销毁的相关文章

转:Android线程的创建与销毁

http://mt.sohu.com/20140813/n403395303.shtml?recsyssohu=2 在Android开发中经常会使用到线程,一想到线程,很多同学就立即使用new Thread(){...}.start()这样的方式.这样如果在一个Activity中多次调用上面的代码,那么将创建多个匿名线程,程序运行的越久可能会越来越慢.因此,需要一个Handler来启动一个线程,以及删除一个线程,保证线程不会重复的创建. 1.创建Handler的一般方式  一般会使用Handle

linux内核线程的创建与销毁

linux将创建内核线程的工作交给了一个专门的内核线程kthreadd来完成,该线程会检查全局链表kthread_create_list,如果为NULL,就会调schedule()放弃cpu进入睡眠状态,否则就取下该链表中的一项创建对应的线程.本文就从khtreadd内核线程的创建开始来展示一下内核线程的创建过程.1 kthreaddlinux2.6.30,创建内核线程是通过kethradd内核守护线程来完成的,虽然机制上有所变化,但是最终还是调用do_fork来完成线程的创建.Kthreadd

线程的创建与销毁

启动线程:Start,运行  线程的"绑定"/"执行"方法. 销毁线程:Abort,线程消失. 名词:线程的"执行方法" == 线程的"绑定方法" 线程的"绑定方法"/"执行方法",不但可以是当前实例中的方法(如:1),也可以是其它实例中的方法(如:2,需要创建指定类型的实例,然后引用其方法作为"子线程"的"绑定方法"/"执行方法&quo

Android线程池详解

直接使用线程 在Android开发的时候,当我们需要完成一个耗时操作的时候,通常会新建一个子线程出来,例如如下代码 new Thread(new Runnable() { @Override public void run() { //耗时代码 } }).start(); 这种方式的线程随处可见,但是这种方式的写法是存在一定问题的,我们知道,在操作系统中,线程是操作系统调度的最小单元,同时线程又不能无限制的产生,并且线程的创建和销毁都会有资源的开销,同时当线程频繁的创建或者销毁的时候,还会让GC

Android(java)学习笔记267:Android线程池

1. 线程池 (1)线程池的优点: 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销. 能有效控制线程池的最大并发数,避免大量的线程之间因相互抢占系统资源而导致的阻塞现象. 能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能. (2)Android中的线程池: Android中的线程池的概念来源于Java中的Executor,Executor是一个借口,真正的线程池实现为ThreadPoolExecutor. ThreadPoolExecutor提供了一系列参数来配置

Android线程与线程池

一.特殊的线程 1.AsynTask 底层用到了线程池,封装了线程池和Handler,主要是为了方便开发者在子线程中更新UI 2.IntentService(不完整???) 内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出,底层直接使用了线程(从任务执行的角度来看,IntentService的作用很像一个后台线程,但是IntentService是一种服务,他不容易被系统杀死从而可以尽量保证任务的执行) 3.HandlerThread 是一种具有消

Android(线程二) 线程池详解

我们在ListView中需要下载资源时,赞不考虑缓存机制,那么每一个Item可能都需要开启一个线程去下载资源(如果没有线程池),如果Item很多,那么我们可能就会无限制的一直创建新的线程去执行下载任务,最终结果可能导致,应用卡顿.手机反应迟钝!最坏的结果是,用户直接卸载掉该App.所以,我们在实际开发中需要考虑多线程,多线程就离不开线程池.如果你对线程还不了解,可以看看这篇文章,Android(线程一) 线程. 使用线程池的优点: (1).重用线程,避免线程的创建和销毁带来的性能开销: (2).

android线程与线程池-----线程池(二)《android开发艺术与探索》

android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的管理,提供定时执行以及指定间隔时间循环执行等 android 中的线程池源自java 中的Executor,Executor是一个接口,正真的实现是ThreadPoolExecutor. ThreadPoolExecutor 提供参数配置线程池. 下面是一个常用的构造方法: public Threa

Android线程池-学习总结

线程池: 一个线程池中会缓存一定数量的线程,通过线程池就可以避免因为频繁创建和销毁线程所带来的系统开销.Android中的线程池来源于Java,主要是通过Executor来派生特定类型的线程池. 优点: