请问如何结束Handler的线程

rocky225 2011-03-24 10:00:47
removeCallbacks()方法无法结束Handler创建的线程
...全文
2461 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
fange 2013-11-06
  • 打赏
  • 举报
回复
HandlerThread thread=new HandlerThread("netthread"); thread.start(); Handler r=new Handler(thread.getLooper()); r.postDelayed(new java.lang.Runnable(){ public void run() { …… }}, 1000); 这个线程只执行一回……
骨灰级菜虫 2013-08-30
  • 打赏
  • 举报
回复
学习了
zzw810215 2012-05-23
  • 打赏
  • 举报
回复

private myRunnable runnable = new myRunnable();
private Handler myHandler = new Handler(){

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.arg1 > 100){
myHandler.removeCallbacks(runnable);
}
else{
progressBar.setProgress(msg.arg1);
myHandler.post(runnable);
System.out.println(msg.arg1);
}
}
};

class myRunnable implements Runnable{
int i = 0;
public void run() {
// TODO Auto-generated method stub
i = i + 10;
Message message = myHandler.obtainMessage();
message.arg1 = i;
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
myHandler.sendMessage(message);
}
}
zzw810215 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
语句放到
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
就好……
[/Quote]
这个可以~
gs19871026 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 firepopo 的回复:]


if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
语句放到
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
……
[/Quote]太帅了
firepopo 2011-07-19
  • 打赏
  • 举报
回复

if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
语句放到
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
就好了,因为sendmessage后虽然判断结束了线程,但在handlemessage方法中重新启用线程了。
VinkyQ 2011-04-07
  • 打赏
  • 举报
回复
直接把这个线程的引用变量置为NULL,交给GC去回收就可以了.
在stop()方法废弃的情况下,这是比较稳妥的方法之一.
steryzone 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 smilezkangel 的回复:]
引用 3 楼 zhangnianxiang 的回复:
handler.removeCallbacks();
可以结束的
我在Hander的另外一个线程中写一个死循环,在程序运行过程中 已经用过了hander.removeCallbacks()方法 可以死循环并没有结束 ,还在继续,
求解!!!
[/Quote]
直接用一个标识去让死循环结束不就行了。。。。
hander.removeCallbacks()方法是结束线程而不是死循环
JiuJie_ 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taiji1985 的回复:]

呵呵,停止线程,虽然早期有stop函数,但是后来给废弃了. 所以你现在的办法只有用结束标志.


设置一个结束标志
Java code

boolean flag = true;


.... Thread ...{
public void run()
{
while(flag){
//do some thing
}
}
[/Quote]
确实,貌似,一个线程开起来了,在android框架下,好像没有更好的方法说去很好的结束掉该进程。
kkkk11kk 2011-04-04
  • 打赏
  • 举报
回复
貌似是应该设置结束的标志位
fyhack 2011-04-04
  • 打赏
  • 举报
回复
操作系统 PV操作...
uyu2yiyi 2011-04-03
  • 打赏
  • 举报
回复
我的问题是想加入一个监听器
在点击之后提前停止线程的运行 这个不知道怎么实现
uyu2yiyi 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rocky225 的回复:]

但是当i加到100以上都还没停止,还有线程在运行
我想handler是不是会不断的创建线程装入到队列中的呢?
[/Quote]

根据我的观察,应该是removeCallbacks把线程移出消息队列
但是线程还没有结束 还在继续运行

f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
里加上 return; 应该就行了,这样:

f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
return;
}
TaiJi1985 2011-04-03
  • 打赏
  • 举报
回复
呵呵,停止线程,虽然早期有stop函数,但是后来给废弃了. 所以你现在的办法只有用结束标志.


设置一个结束标志

boolean flag = true;

.... Thread ...{
public void run()
{
while(flag){
//do some thing
}
}
chenzubin 2011-04-03
  • 打赏
  • 举报
回复
貌似你说的是线程的问题,跟HANDLER没什么太大关系
qinglongjiao059 2011-04-03
  • 打赏
  • 举报
回复
来学习下
DrSmart 2011-04-03
  • 打赏
  • 举报
回复
thread开启不好停掉,内部设置标记可以让其停止,不过遇到线程死锁你还是要在代码层上尽量返回,比如用轮训方式处理状态机
bigpretty 2011-04-03
  • 打赏
  • 举报
回复
设置标记才是正解
uyu2yiyi 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taiji1985 的回复:]

呵呵,停止线程,虽然早期有stop函数,但是后来给废弃了. 所以你现在的办法只有用结束标志.


设置一个结束标志
Java code

boolean flag = true;

.... Thread ...{
public void run()
{
while(flag){
//do some thing
}
}
[/Quote]

恩 有用,我的问题解决了
谢谢~
uyu2yiyi 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 smilezkangel 的回复:]

引用 3 楼 zhangnianxiang 的回复:
handler.removeCallbacks();
可以结束的
我在Hander的另外一个线程中写一个死循环,在程序运行过程中 已经用过了hander.removeCallbacks()方法 可以死循环并没有结束 ,还在继续,
求解!!!
[/Quote]

我的思路: 设置一个if()语句来作为结束线程的条件,比如说if(msg.arg1 == 200)
然后需要循环结束的时候,把msg的值设置成200发送给线程,这样是不是就可以结束线程了?

我自己的试验结果失败,我把msg设为类的成员变量,然后在把结束线程的条件msg值发给线程
结果虚拟机报错-___________________-

不知道是我的思路错了,还是我执行思路的方法错了?
加载更多回复(8)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧