android 避免线程的重复创建
来源:互联网 发布:地方门户系统源码 编辑:程序博客网 时间:2024/06/05 05:33
最近在android开发中,用到都是new Thread(){...}.start()这种方式。本来这样是可以,但是最近突然爆出Performing stop of activity that is not resumed 错误,google了一下发现是线程多次创建的问题;
多次使用上面的方式,会创建多个匿名线程。使得程序运行起来越来越慢。
因此,可以考虑使用一个Handler来启动一个线程,当该线程不再使用就删除,保证线程不会重复创建。
一般会使用Handler handler = new Handler(){...}创建Handler。这样创建的handler是在主线程即UI线程下的Handler,
即这个Handler是与UI线程下的默认Looper绑定的。Looper是用于实现消息队列和消息循环机制的。
因此,如果是默认创建Handler那么如果线程是做一些耗时操作如网络获取数据等操作,这样创建Handler是不行的。
Android API提供了HandlerThread来创建线程。官网的解释是:Handy class for starting a new thread that has a looper.
The looper can then be used to create handler classes. Note that start() must still be called.
HandlerThread实际上就一个Thread,只不过它比普通的Thread多了一个Looper。
创建HandlerThread时要把它启动了,即调用start()方法。然后创建Handler时将HandlerThread中的looper对象传入。
代码如下
HandlerThread thread = new HandlerThread("MyHandlerThread");thread.start();mHandler = new Handler(thread.getLooper());mHandler.post(new Runnable(){...});
完整代码(需要在调用线程的Activity 在销毁时 移除线程)
public class MainActivity extends Activity implements OnClickListener{private Handler mHandler;private HandlerThread mHandlerThread;private boolean mRunning;private Button btn;@Overrideprotected void onDestroy() { mRunning = false; mHandler.removeCallbacks(mRunnable); super.onDestroy();}@Overrideprotected void onResume() { mRunning = true; super.onResume();}@Overrideprotected void onStop() { mRunning = false; super.onStop();}@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); mHandlerThread = new HandlerThread("Test", 5); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper());}private Runnable mRunnable = new Runnable() { @Override public void run() { while (mRunning) { Log.d("MainActivity", "test HandlerThread..."); try { Thread.sleep(200); } catch (Exception e) { e.printStackTrace(); } } }};@Overridepublic void onClick(View v) { switch(v.getId()) { case R.id.btn : mHandler.post(mRunnable); break; default : break; }}}
0 0
- android 避免线程的重复创建
- 避免创建重复的对象
- 避免创建重复的对象
- 避免创建重复的对象
- 避免创建重复的对象
- java避免创建重复的对象
- JAVA:避免重复的创建对象
- Android 避免Activity重复创建 一次finish()返回上个页面
- Android 多个Fragment切换时,避免重复创建Fragment。
- Android 避免重复提交
- notification | 避免Acitivity重复创建
- 第4条:避免创建重复的对象
- 线程间的通信,避免创建过多线程
- 避免使用CreateThread 创建线程
- Delphi中避免创建重复窗体
- 避免重复提交的方法
- 避免表单的重复提交
- 避免重复的ajax请求
- 题目1083:特殊乘法
- Shape Faces and Winding(物体的方向和环绕)
- linux下的source命令
- qemu中KVM硬件虚拟化的初始化分析 (tcg、xen、kvm、qtest)(转)
- iOS程序员必看的书
- android 避免线程的重复创建
- fig
- java验证码
- ZigBee 3.0 为广泛设备创建单一开放式全球无线标准
- excel日期转星期(批量处理)
- python学习之基础知识(四)
- 学习Python编程的11个资源
- 菜鸟学自动化测试(一)----selenium IDE
- 自己写日志记录类,讲日志记录在exel中