关于android 线程切换运行和停止状态

本文探讨了线程管理的常见问题及优化方法,并详细分析了如何通过Handler和Runnable实现UI动画的流畅切换,避免卡顿现象。通过对比两种不同实现方式,总结了各自的优缺点,最终提供了优化后的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近碰到一个关于线程的问题,真是太乱了!看过后想梳理一下

开始用线程的时候本想 用一个变量,让他自己运行玩消失:就是while(!stop)设置stop=true

结果重新start的时候,老是说已经start了,不能再start了,没办法只好用stop 结果还真行,不报错了,但

后来发现stop压根就没停止这个线程,没办法,只好每次都new一个这个线程的实例,然后让当设置变量为true时

让它=null,还真管用。

但是我ui 里面的动画怎么都看着有点卡,当点击button进行切换的时候(需要各种关于这个 动画的 切换:界面之间切换,button切换)

明显很卡。

后来找了个hander的setmessage 在里面直接写代码,里面有个sendEmptyMessageDelayed()方法,在这里面确实实现了所有要求的内容

不过不清楚我之前的为什么会卡。

原来是开的其他的东西太多了,首先多开了个线程,另一个线程也是没啥必要的。完全可以在runnable里面实现while 并post,还有就是其他地方也post了一下

也是很浪费的。无非是多了一种方法,但setmessage确实有其方便的地方。当你同时处理多个事件的时候 它只需要setmessage(1 ,500),(2,300)等,

但如果在runable就扯淡了。

第一种方法:

class MyHandler extends Handler {

public MyHandler() {

}
public MyHandler(Looper L) {

super(L);
}
@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub
super.handleMessage(msg);
// 此处可以更新UI
if(msg.what==1)
{
timeMargin++;
timeMargin=timeMargin%4;
startAnimation();
this.sendEmptyMessageDelayed(1, 500);
}
if(msg.what==2)
{
if(lightingTime!=-1)
{
image_modep.setVisibility(View.GONE);
this.sendEmptyMessageDelayed(2, lightingTime);
}

}
}
}

public void StartAnim()
{
if(myhd!=null)
{
myhd.sendEmptyMessageDelayed(1, 500);
if(lightingTime!=-1)
myhd.sendEmptyMessageDelayed(2, lightingTime);
}

}
public void StopAnim()
{
if(myhd!=null)
{
myhd.removeMessages(1);
myhd.removeMessages(2);
}

}

第二种方法:

class myThread1 extends Thread
{
public boolean stop=false, isFirst=true;
public void run()
{
while (!stop) {
isFirst=false;

timeMargin++;
timeMargin = timeMargin % 4;

myhd.post(myRn);

try {
if(lightingTime==-1)
{
flag=true;
Thread.sleep(500);
}
else
{
flag=!flag;
Thread.sleep(lightingTime);
}
//Log.v("ddddddddddd", "aaaaaaaaaaaaaa");

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

Handler myhd = new Handler();
final myRunnable2 myRn = new myRunnable2();

class myRunnable2 implements Runnable {
@Override
public void run() {
if(lightingTime!=-1)
{
if(flag)
image_m.setVisibility(View.VISIBLE);
else
image_m.setVisibility(View.GONE);
}

startAnimation();
}
}

public void StartAnim()
{
if(myhd!=null)
{
myhd.sendEmptyMessageDelayed(1, 500);
if(lightingTime!=-1)
myhd.sendEmptyMessageDelayed(2, lightingTime);
}

}
public void StopAnim()
{
if(myhd!=null)
{
myhd.removeMessages(1);
myhd.removeMessages(2);
}

}

还是没看到两种方法的优缺点,算了,该走人了!以后用到在比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值