博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 避免线程的重复创建(HandlerThread、线程池)
阅读量:6625 次
发布时间:2019-06-25

本文共 3005 字,大约阅读时间需要 10 分钟。

最近在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是不行的。
 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 在销毁时 移除线程)

1 public class MainActivity extends Activity implements OnClickListener{   2 private Handler mHandler;   3 private HandlerThread mHandlerThread;   4 private boolean mRunning;   5 private Button btn;   6 @Override   7 protected void onDestroy() {   8     mRunning = false;   9     mHandler.removeCallbacks(mRunnable);  10     super.onDestroy();  11 }  12 @Override  13 protected void onResume() {  14     mRunning = true;  15     super.onResume();  16 }  17 @Override  18 protected void onStop() {  19     mRunning = false;  20     super.onStop();  21 }  22 @Override  23 protected void onCreate(Bundle savedInstanceState) {  24     super.onCreate(savedInstanceState);  25     setContentView(R.layout.activity_main);  26     btn = (Button) findViewById(R.id.btn);  27     btn.setOnClickListener(this);  28     mHandlerThread = new HandlerThread("Test", 5);  29     mHandlerThread.start();  30     mHandler = new Handler(mHandlerThread.getLooper());  31 }  32 private Runnable mRunnable = new Runnable() {  33     @Override  34     public void run() {  35         while (mRunning) {  36             Log.d("MainActivity", "test HandlerThread...");  37             try {  38                 Thread.sleep(200);  39             } catch (Exception e) {  40                 e.printStackTrace();  41             }  42         }  43     }  44 };  45 @Override  46 public void onClick(View v) {  47     switch(v.getId()) {  48     case R.id.btn :  49         mHandler.post(mRunnable);  50         break;  51     default :  52         break;  53     }  54 }  55 }

 转自:http://blog.csdn.net/a_tao123/article/details/41279019

 

/***************************************************************************************************************************************************************************/

然而最后我发现还是线程池更好用。。。

ExecutorService mExecutorService;mExecutorService.submit(new Runnable() {            @Override            public void run() {                //需要操作的代码            }        });

将每次需要提交的线程都用mExecutorService.submit()放入线程池中即可。

 

转载于:https://www.cnblogs.com/Sharley/p/6934121.html

你可能感兴趣的文章
运维角度浅谈MySQL数据库优化
查看>>
多版本python下,安装pip
查看>>
AndroidManifest.xml文件解析
查看>>
互联网 免费的WebService接口
查看>>
【我的V日志】2010年1月29日星期五
查看>>
我的友情链接
查看>>
六种微服务架构的设计模式
查看>>
路由器配置大全
查看>>
JACK——AgentManual3 Agents
查看>>
[转载] 的士速递4
查看>>
基于QT平台的手持媒体播放器项目实战视频教程下载
查看>>
一名奔三的程序猿的困惑
查看>>
嵌入式Linux裸机开发(一)——点亮Led
查看>>
搭建Websocket简易聊天室
查看>>
Oracle技术之flashback table
查看>>
PIE SDK文本元素的绘制
查看>>
asp.net 页面传值
查看>>
解决将/etc/passwd文件中1000改为0后只能guest进入系统的问题 ||ubuntu下将普通用户权限升级为root用户权限的方法;...
查看>>
【Python实战】Scrapy豌豆荚应用市场爬虫
查看>>
Linux 内核中断内幕
查看>>