最近做毕业设计,在抽象层次上需要做一些统一的可复用界面交互方法,比如对话框。具体需求是通过调用一个方法,这个方法体中生成一个对话框与用户交互,等与用户交互完毕后将用户输入的信息返回,用伪代码来体现,结构大致如下:
[mw_shl_code=java,true]public Object getXXXByDialog(){
Object result;
result = showDialog();//显示一个对话框与用户交互,并返回用户输入的信息
return result;//返回用户输入的信息
}[/mw_shl_code]
很容易理解的结果,但是实现起来很麻烦,因为遇到一个同步和异步机制的问题。
在Android中,启动一个activity,serivice,对话框等等这些组件都是采用异步的机制(通过消息循环和消息队列)。也就是在上面的代码中,执行showDialog方法显示一个对话框后,不等对话框将用户输入的信息返回,showDialog下一行的return就会马上执行。所以在上面的伪代码结构中,return返回的结果永远都是null。整个过程用图形来表示大致如下,如图:
当使用showDialog方法后,实际上就是向消息队列中发送消息,要求启动对话框。消息发送完了之后就继续执行showDialog后面的代码,对话框什么时候出现取决于对话框的消息处理的时候。因为处理的很快,所以就好像是showDialog调用后就直接显示出了对话框,但实际上showDialog后面的代码已经执行了。
解决这个问题的思路就是想办法让对话框显示,并且用户输入信息后把对话框结束了再执行return方法