需求:需要做一个弹框,弹框完成后再进行其它数据处理。
开始的时候在主线程做了for循环来处理弹框触发和相应的逻辑,结果发现无论是alertdialog还是popupwindow都无法真正做到阻塞主线程处理。
开始的时候有了个奇葩的想法,想写标志位来阻塞主线程。。。弹框结束后来改写标志位,结果你懂的。。。(ui全阻塞。。。)
后来发现其实问题的根源就在于主线程for循环,就不应该用for循环。
现在的流程是使用handler来接收消息,然后在handler中触发popupwindow弹框,在popupwindow中当按键按下时,再发送消息给handler,处理下一条数据。这样就解决了。
附代码:
handler的代码
private Handler hander = new Handler() { @Override public void handleMessage(Message msg) { if (msg.obj instanceof Integer) { int pos = (Integer) msg.obj; if (pos<downloadlist.size()) {
if (***)
{
//弹框 showDialog(identity,pos); } else
{
//跳下一条数据 Message message = hander.obtainMessage(0, pos+1); hander.sendMessage(message); } } else { //任务完成 Utility.showToast("***"); } } } };
showDialog当dialog处理完成后,再调用跳转回队列处理数据。
//跳下一条数据 Message message = hander.obtainMessage(0, pos+1); hander.sendMessage(message);