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线程时,关键在于优雅、安全地中断操作,而不是简单粗暴地停止。合理的线程管理可以提升用户体验,避免ANR,并保持应用程序的稳定运行。正确使用Thread、AsyncTask、Handler和Looper等工具,结合...
3. ExecutorService:Java提供的线程池服务,可以创建固定数量的线程,适合处理并发上传任务,避免了频繁创建销毁线程的开销。 4. OkHttp库:OkHttp是一个高效的HTTP客户端,支持自定义拦截器,可以方便地实现多线程...
4. 优化线程池,避免大量线程创建和销毁带来的开销,可以使用ThreadPoolExecutor。 5. 使用现代Android架构组件,如WorkManager,它可以处理复杂的后台任务调度。 总结,理解和掌握Android线程管理是提升应用性能的...
5. **ThreadPoolExecutor**:Android虽然不直接支持,但可以通过引入Java并发库来实现线程池,它可以帮助优化线程资源,减少线程创建和销毁的开销,适用于大量并发任务。 6. **RxJava/RxAndroid**:这是一种基于...
### Java/Android线程使用深度解析 在计算机科学领域,线程与进程是核心概念,尤其是在多任务操作系统中。本文将深入探讨Java/Android环境下的线程管理,包括线程的创建、线程池的利用及`ThreadHandler`的运用等...
- **使用Executor服务**:更高级的方式,可以管理线程池,避免大量创建销毁线程的开销。 3. **AsyncTask**:Android提供的轻量级异步任务框架,包含`onPreExecute()`, `doInBackground()`, `onProgressUpdate()`, ...
3. 使用线程池管理并发,避免频繁创建销毁线程。 4. 使用Handler或FutureTask等机制进行线程间通信,确保UI更新的正确性。 5. 注意异常处理,避免线程因未捕获异常而崩溃。 综上所述,Android多线程操作是提升应用...
在开发过程中,理解并熟练掌握Activity的生命周期、线程优先级、异常销毁以及任务栈原理,可以帮助我们编写出更加稳定、高效且用户体验良好的Android应用。在ActivityLifecycle这个项目中,开发者可以通过参考代码来...
本篇文章将详细介绍Android线程的基础知识、使用方法及同步机制等内容。 #### 一、Android线程概述 在Android应用开发过程中,线程的应用非常广泛。线程作为进程中的执行单元,可以被用来处理一些耗时操作,如网络...
**Android多线程机制**\n- **线程创建**:Android基于Java线程模型,可以使用`Thread`类或`Runnable`接口创建新线程。线程内部通常包含一个`run()`方法,执行完毕后线程结束。\n- **消息队列与Handler**:每个线程...
首先,Activity生命周期是Android应用开发中的基础,它描述了Activity从创建到销毁的各个阶段,包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法。开发者需要理解每个阶段的含义以及...
线程池可以控制并发线程的数量,避免大量创建和销毁线程带来的性能开销,同时提供任务调度和优先级管理。 3. **下载任务分解**:根据文件大小,将其划分为若干块,每块作为一个下载任务分配给线程。块大小的选择需...
线程池可以避免频繁创建和销毁线程的开销,提高性能。通过`Executors`类提供的静态方法,如`newFixedThreadPool`,可以创建一个固定大小的线程池,用于执行多线程任务。 2. **异步任务和AsyncTask**: Android提供...
因此,理解并掌握Android线程间的通信机制,尤其是message(消息)机制,对于优化应用性能至关重要。 Android线程间通信的主要方式有:Handler、Looper、Message以及BroadcastReceiver等。其中,Handler-Looper-...
它可以更好地管理和调度线程,避免线程创建和销毁带来的开销。 了解并熟练掌握这些多线程操作方式,有助于开发者编写高效、稳定的Android应用。在实际开发中,应根据任务特性和需求选择合适的方法,合理利用多线程...
在Android中,我们可以使用Java的Thread类或者Runnable接口,或者更高级的ExecutorService和AsyncTask来创建并管理线程。 1. **线程基础**: - Thread类:直接继承Thread类并重写run()方法,创建新线程。 - ...
这个"Android线程问题.rar"压缩包可能包含了关于Android多线程的一些深入问题和实践案例,帮助开发者提升这方面的专业能力。 在Android系统中,主线程(也称为UI线程)负责处理用户交互事件,如触摸屏幕、显示通知...
例如,固定大小的线程池可以避免频繁地创建和销毁线程,提高性能。 六、ScheduledExecutorService ScheduledExecutorService允许我们调度任务,如定时执行或周期性执行。这对于需要定期更新或者延时执行的任务非常...
线程池能够有效地管理和复用线程,避免频繁创建和销毁线程带来的性能开销。例如,我们可以使用`Executors`的`newFixedThreadPool`方法创建固定大小的线程池。 ```java ExecutorService executorService = Executors...
`SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,提高应用性能。本篇文章将深入解析如何在`SurfaceView`中添加线程以及相关的源码分析。 首先,`...