看起来像一个新的Activity(由startActivityForResult 调用)和一个Handler(从onActivityResult 调用)可以解决您的问题。
看看下面的design-sn-p:
假设您愿意“睡眠”的方法是来自MainActivity 类的doSomething。我假设这是从某个事件处理程序实现中调用的。您应该将该方法中的所有调用移至BackgroundActivity 活动中,
- 应该显示 ProgressDialog 和/或没有其他内容 -。
在您的 doSomething 方法中,您应该通过使用
指向 BackgroundActivity 的意图来启动活动
this.startActivityForResult(new Intent(this, BackgroundActivity.class),
BG_ACTIVITY_ID);
其中 BG_ACTIVITY_ID 是您启动活动的唯一标识符,因此当它完成时,您可以处理它。
在processBackgroundData里面(或者后台activity处理完毕的时候),你应该在调用finish()之前设置结果:
final Intent intent = new Intent();
intent.putExtra(KEY_FOR_DATA_YOU_NEED, dataYouNeed);
setResult(Activity.RESULT_OK, intent);
finish();
在您的 MainActivity 中,您还应该重写 onActivityResult 方法,以从已完成的 BackgroundActivity 任务中检索必要的信息:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
//you might also want to check if the resultCode is `Activity.RESULT_OK`...
switch (requestCode)
{
case BG_ACTIVITY_ID:
//get the data you need
final String dataYouNeed = data.getStringExtra(KEY_FOR_DATA_YOU_NEED);
//process the data...
//if necessary (threads!), call your backgroundHandler's
//sendMessage with the retrieved informations as obj.parameters
[...]
break;
default:
[...]
break;
}
}
在你的BackgroundHandler 的handleMessage 方法中(因为你回到了ui线程:你的主应用程序正在运行的线程)你可以做所有必要的ui修改,也可以监听用户事件。
这样您就可以摆脱无限循环,并且可以始终了解用户交互。