android - Why does this Thread freeze the UI -
in code have send message long togglebutton
checked. prevent ui thread freezing, put action in seperate thread.
my problem is, still freezes, don't know why
this relevant code:
private togglebutton.onclicklistener lightmirroronclicklistener = new togglebutton.onclicklistener() { @override public void onclick(view v) { if (lightmirrorbtn.ischecked()) { lightthread = new lightthread(); lightthread.start(); } else if(!lightmirrorbtn.ischecked()) { lightthread.interrupt(); } } }; class lightthread extends thread { handler lighthandler = new handler(); runnable light = new runnable() { public void run() { while (lightmirrorbtn.ischecked()) { lighttxmsg.frameformat = constantlist.standard_frame; lighttxmsg.frametype = constantlist.data_frame; lighttxmsg.datalength = (byte) 8; lighttxmsg.messageid = 0x3c1; int[] messagearray = ambi_light; (int = 0; < lighttxmsg.datalength; i++) { lighttxmsg.data[i] = messagearray[i]; } returncode = democontroller.transmitmessage(lighttxmsg, constantlist.binary_format); } } }; public void run() { while (!isinterrupted()) { try { thread.sleep(60); lighthandler.post(light); } catch (interruptedexception e) { break; } } } }
edit: solution problem:
private togglebutton.oncheckedchangelistener lightmirroronclicklistener = new togglebutton.oncheckedchangelistener() { @override public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) { if (ischecked == true) { new thread(new runnable() { public void run() { lighttxmsg.frameformat = constantlist.standard_frame; lighttxmsg.frametype = constantlist.data_frame; lighttxmsg.datalength = (byte) 8; lighttxmsg.messageid = 0x3c1; int[] messagearray = ambi_light_on; (int = 0; < lighttxmsg.datalength; i++) { lighttxmsg.data[i] = messagearray[i]; } returncode = democontroller.transmitmessage(lighttxmsg, constantlist.binary_format); } }).start(); } else if (!ischecked) { new thread(new runnable() { public void run() { lighttxmsg.frameformat = constantlist.standard_frame; lighttxmsg.frametype = constantlist.data_frame; lighttxmsg.datalength = (byte) 8; lighttxmsg.messageid = 0x3c1; int[] messagearray = ambi_light_off; (int = 0; < lighttxmsg.datalength; i++) { lighttxmsg.data[i] = messagearray[i]; } returncode = democontroller.transmitmessage(lighttxmsg, constantlist.binary_format); } }).start(); } } };
handler lighthandler = new handler();
when create handler thread has not yet started. being created. so, according handler
's default constructor documentation handler associated "with looper current thread" ... main(ui) thread. post messages on main thread.
you don't need handler
post runnable on. can either:
- create thread , specify it's actions in
run()
method or - pass
runnable
thread executed in thread usingthread(runnable)
constructor
here basic articles threads
:
Comments
Post a Comment