BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #26345同步于 2013/7/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【请教大牛】关于handler和线程的问题

happy1100
2013/7/14镜像同步4 回复
源代码如下,此代码作用是利用handler实现进度条的更新。问题就在handler开启的线程没有随着onDestroy()的调用而销毁,也没有随着 if(i==100) { handler.removeCallbacks(r); } 而停止这个线程,这个线程就是一直的跑着的。通过Debug调试,可以看到在i=10的时候调用了handler.sendMessage(msg),然后又调用了 if(i==100) { handler.removeCallbacks(r); } 不过handler.removeCallbacks(r);并没有阻止程序调用 public void handleMessage(Message msg) { bar.setProgress(i); handler.postDelayed(r,500); } ,所以这个程序就一直运行着,即使调用OnDestroy中的handler.removeCallbacks(r);也不好使,有木有大牛帮着看看解答一下啊,真心困扰很久了呀···。 package com.example.handlerlesson; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends Activity { ProgressBar bar; Button button; Handler handler= new Handler() ; int i=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bar=(ProgressBar)findViewById(R.id.bar); button=(Button)findViewById(R.id.button); bar.setMax(100); button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub handler.post(r); } }); handler= new Handler(){ @Override public void handleMessage(Message msg) { bar.setProgress(i); handler.postDelayed(r,500); } }; } Runnable r= new Runnable(){ @Override public void run() { Message msg= handler.obtainMessage(); i=i+10; msg.arg1=i; Log.e("---------Runnable------", Thread.currentThread().getName()+"----"+i); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } handler.sendMessage(msg); if(i==100) { handler.removeCallbacks(r); } } }; @Override protected void onDestroy() { // TODO Auto-generated method stub handler.removeCallbacks(r); Log.e("tag3", "onDestroy"); super.onDestroy(); } }
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
lixing机器人#1 · 2013/7/15
你只是将handler中的线程移出handler,而不是结束了线程。结束线程需要调用Thread.currentThread().interrupt();
xlover机器人#2 · 2013/7/15
第一 逻辑可能有点问题 第二 r定义成static的
zjpchristy机器人#3 · 2013/7/16
程序的逻辑不对,按照你这样写,程序陷入了死循环,所以线程会一直跑
jaywawa机器人#4 · 2013/7/16
。。。这个不应该一直跑么?。。。你在程序最后把thread interupt就好了。。。