一个简单的handler的进程停止问题,望高手帮帮小弟···

H602miss 2011-10-27 11:43:51
进度条默认的最大值为100,当i为100 时 然后调用handler.removeCallbacks(run);这个方法来停止这个进程,但是在run方法中写入System.out.println("BarProgress---->"+bar.getProgress());发现这个进程并没有停止还是在继续运行,任然在输出BarProgress---->100,这是为什么啊?
代码在下面···


package com.www;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class HandlerBarActivity extends Activity {
/** Called when the activity is first created. */
ProgressBar bar =null;
Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btn = (Button) findViewById(R.id.myBtn);
bar = (ProgressBar) findViewById(R.id.progressBar);

btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
handler.post(run);
}
});

}

Handler handler = new Handler(){

public void handleMessage(Message mes){
bar.setProgress(mes.arg1);
handler.post(run);
}

};

Runnable run = new Runnable(){
int i=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("BarProgress---->"+bar.getProgress());
i=i+10;
Message msg = handler.obtainMessage();
msg.arg1=i;

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

handler.sendMessage(msg);
if(100==i){
handler.removeCallbacks(run);

}
}

};
}


...全文
490 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Listening_music 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fenger8293 的回复:]
你的代码明显的问题多处。Handler.post(Runnable)方法是利用消息机制让Handler执行一次Runnable的代码,其执行是在当前线程完成的。Handler的handleMessage方法是当Handler收到消息时候执行对应消息的处理代码,在你的代码里没有对消息的what参数归类处理,则所有消息都会执行下面的代码。我们再来看看你的Runnable接口,刚才说过post方法执行的……
[/Quote]
先申明一下哈,我不是你说的那个同一个发帖人的人啦~
还有,你说不需要我们主动去remove那个回调函数,那我最后点击BACK按键结束该进程的时候为什么那个handleMessage还是一直在执行呢?就算我在onDestroy函数里remove回调了,也结束了创建的子进程了也还是在一直抛消息和处理消息呀,这是为什么呢?
额……我的代码:
package com.test.handler;

import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MultiThreadHandler extends Activity {
private ProgressBar myProgressBar;
private Button myButton;

HandlerThread barThread = new HandlerThread("ChildThread");
myHandler barHandler;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

myProgressBar = (ProgressBar) findViewById(R.id.progressbar_id);
myButton = (Button) findViewById(R.id.button_id);

// HandlerThread barThread = new HandlerThread("myThread");
barThread.start();
barHandler = new myHandler(barThread.getLooper());
// myHandler barHandler = new myHandler(barThread.getLooper());
myProgressBar.setProgress(10);
Log.i("TAG", "onCreate ---> " + Thread.currentThread().getName());

Message msg = barHandler.obtainMessage();
msg.arg1 = 0;
msg.sendToTarget();
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myProgressBar.setProgress(70);
Log.i("TAG", "Click the Button...");
Message msg = barHandler.obtainMessage();
msg.arg1 = 80;
msg.sendToTarget();
barHandler.post(barThread);
// myProgressBar.setProgress(60);

}
});
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
barHandler.removeCallbacks(barThread);
barThread.stop();
}

class myHandler extends Handler {
public myHandler() {

}

public myHandler(Looper myLooper) {
super(myLooper);
}

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int ms = msg.arg1;
Log.i("TAG", "handlerMessage ---> "
+ Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myProgressBar.setProgress(50);// //////////////////////////////////////
Log.i("TAG", "The message here is " + ms);
Message msg1 = barHandler.obtainMessage();
if (msg1.arg1 < 100) {
msg1.arg1 = msg1.arg1 + 10;
msg1.sendToTarget();
// barHandler.post(barThread);
}
}
}
}


手指风 2011-10-28
  • 打赏
  • 举报
回复
最后一句少写了一个参数,应该是handler.postDelay(run,1000);
手指风 2011-10-28
  • 打赏
  • 举报
回复
正确的代码如下:

package com.www;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class HandlerBarActivity extends Activity {
/** Called when the activity is first created. */
ProgressBar bar =null;
Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btn = (Button) findViewById(R.id.myBtn);
bar = (ProgressBar) findViewById(R.id.progressBar);

btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
handler.postDelay(run,1000);
}
});

}

Handler handler = new Handler();

Runnable run = new Runnable(){
@Override
public void run() {
//这里对进度条进行累加
if(100 != bar.getProgress()){
handler.postDelay(run);
}
}
};
}
手指风 2011-10-28
  • 打赏
  • 举报
回复
你的代码明显的问题多处。Handler.post(Runnable)方法是利用消息机制让Handler执行一次Runnable的代码,其执行是在当前线程完成的。Handler的handleMessage方法是当Handler收到消息时候执行对应消息的处理代码,在你的代码里没有对消息的what参数归类处理,则所有消息都会执行下面的代码。我们再来看看你的Runnable接口,刚才说过post方法执行的Runnable是当前线程执行的,所以你的Sleep会造成UI的短时间无反应。然后你通过obtainMessage获取了一个消息,并通过sendMessage方法向消息队列添加了这个消息,并马上根据是否进度为100 removeCallbacks了Runnable,需要了解的是你用post方法来执行的Runnable并不需要你去remove,这个方法往往用在我们要取消一个回调。比如我在弹出后执行一个postDelay来定时关闭弹窗,但在用户对弹窗进行操作后,我们需要不继续原先的延时关闭,而是先remove掉后再开启一个延时,这样效果就是用户不对弹窗UI操作后规定的延时后关闭弹窗(PopupWindow)。那么为什么你的代码会一直执行呢?因为你的sendMessage是往消息队列插入了一个消息,而handleMessage方法肯定会在你的if(100==i){
handler.removeCallbacks(run);
之后来执行,CPU不会直接中断你的runnable来先执行你的handleMessage,所以你的remove就没有意义了。
H602miss 2011-10-28
  • 打赏
  • 举报
回复
嘿嘿``` 把removeCallbacks(Runnable r)方法理解错了[Quote=引用 2 楼 fishmen26 的回复:]
public final void removeCallbacks (Runnable r)
Since: API Level 1

Remove any pending posts of Runnable r that are in the message queue.

这个函数的作用是把你让在消息队列里的这个runnable 对象从handler的消息队列中remove掉。并没有说……
[/Quote]
asssasharp 2011-10-28
  • 打赏
  • 举报
回复
退出线程就把握。
fishmen26 2011-10-28
  • 打赏
  • 举报
回复
public final void removeCallbacks (Runnable r)
Since: API Level 1

Remove any pending posts of Runnable r that are in the message queue.

这个函数的作用是把你让在消息队列里的这个runnable 对象从handler的消息队列中remove掉。并没有说要停掉这个线程
H602miss 2011-10-28
  • 打赏
  • 举报
回复
马上要沉了 自己顶一下````
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)【采用BPSK或GMSK的Turbo码】MSK、GMS内容概要:本文主要介绍了采用BPSK或GMSK调制方式的Turbo码相关技术研究,重点涵盖GMSK调制下的二比特差分解调方法、Turbo码与BPSK/GMSK调制相结合的系统性能分析,并提供了完整的Matlab代码实现方案。研究内容包括调制解调原理、编码结构设计、误码率仿真及系统优化等关键环节,旨在通过仿真手段验证所提出方案的有效性和可靠性,帮助研究人员深入理解现代数字通信系统中的关键技术和其实现方法。; 适合人群:具备一定通信原理和Matlab编程基础,从事无线通信、信号处理、编码理论等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握GMSK调制与Turbo码结合的系统设计与仿真方法;②学习二比特差分解调算法在实际通信系统中的应用;③通过Matlab代码实现提升对数字调制解调和信道编码技术的理解与实践能力;④为相关课题研究、毕业设计或工程项目提供参考和技术支持。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,对照通信系统基本原理深入理解各环节功能,重点关注调制解调过程与Turbo译码的协同工作机制,并尝试修改参数以观察系统性能变化,从而达到理论与实践相结合的学习效果。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 LA 1010 逻辑分析仪被视作一种效能卓越的数字信号分析设备,其核心功能在于对数字通信协议,例如I²C,进行检测与解构。本资源将集中阐述LA 1010的操作流程以及如何借助该设备对I²C协议的波形展开分析。 确保逻辑分析仪被正确地连接至目标系统是极为关键的环节。在运用LA 1010的过程中,必须将分析仪的通道0与通道1分别对应连接至目标装置的SCL(时钟)与SDA(数据)线路。务必保证连接的稳固性且无任何干扰因素,以此确保数据采集的精确度。 随后,需要设定采样参数。采样频率对于能否成功捕捉到信号具有决定性的作用。针对I²C协议,通常选用的采样频率范围介于100kHz到400kHz之间,这一范围的选择取决于实际应用场景中I²C总线的运行速度。然而,LA 1010所能达到的最高采样速率可能高达500MHz,因此需要根据具体需求进行相应的调整。此外,还必须精心挑选适配目标设备工作电压的电压等级,例如3.3V、5V或1.8V。 在软件操作层面,需要选取恰当的通道与协议种类,即I²C。一旦启动采样,逻辑分析仪便开始记录相关数据。软件界面通常会实时展示波形图,为观察与分析提供便利。 关于I²C协议波形的解读,我们可以遵循以下步骤: 1. 总线处于空闲状态时:SCL与SDA均维持在高电平位置,这表明总线当前未进行数据传输。 2. 传输起始信号:当SCL处于高电平期间,SDA线从高电平转换至低电平,此动作标志着数据传输的开始。 3. 地址、数据及应答的识别:在每一个SCL高电平脉冲的持续时间内,SDA线上的电平状态代表了数据位。地址与数据的传输均为双向过程,而读写标识则由SDA线上的电平来...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 在当前文档中,我们将详细研究在C#开发平台中借助BouncyCastle.Crypto库1.8.10版本达成中国的国家标准密码学方案,涵盖SM2、SM3以及SM4这几项技术。这些密码学方案在中国网络安全保障与数据维护领域具有核心地位,为本地化安全解决方案提供了坚实的技术支撑。 让我们首先掌握这三个国家密码算法的基本原理: 1. **SM2算法**:SM2是一种基于椭圆曲线密码体系(ECC)的公钥加密方案,主要用于数字签名和加密操作。它提供了一种高效且安全的身份确认和数据防护机制。 2. **SM3算法**:SM3是一种密码学哈希函数,与SHA-256类似,能够将任意长度的输入信息压缩为固定长度的摘要,常用于数据完整性的检验和确认。 3. **SM4算法**:SM4是一种分组密码方案,采用128位的分组大小和128位的密钥,适用于对称加密,广泛用于无线网络传输和存储数据的加密处理。 接下来,我们将逐步解析如何运用BouncyCastle.Crypto库在C#环境下实现这些密码学方案: **1. 引入库与配置开发环境** 在C#应用程序中,需要通过NuGet包管理工具或手动方式添加BouncyCastle库的引用。务必确保安装的是1.8.10版本。 ```csharp using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; ``` **2. 实施SM2的加签与解签** SM2的签名过程和验证操作涉及椭圆曲线运算。必须创建一个私...

80,488

社区成员

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

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