最近碰到一个关于线程的问题,真是太乱了!看过后想梳理一下
开始用线程的时候本想 用一个变量,让他自己运行玩消失:就是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);
}
}