在onDestroy中执行长时间运行的操作
我有一个“长期运行的”清理行动,我需要执行onDestroy()
我的Activity
。做这个的最好方式是什么?
如果我使用a
Thread
这样做,我onDestroy()
将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。
回答:
我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类close()
方法进行此操作JmDNS
。但是,此方法需要
才能完成。结果,用户Activity
在触摸“返回”键后在很长一段时间内看到了我的屏幕。
我还没有弄清楚为什么close()
花那么长的时间,但是与此同时,我也意识到我真的不需要等待收盘成功完成。我需要的是一种“触发”关闭并完成操作的方法。
回答:
我最终完成了我在问题中提出的要求-我开始在Thread
中执行长期运行的操作onDestroy()
。
我必须考虑的一种情况是,即使在长时间运行之前,用户仍重新打开我的应用程序。在我的应用程序中,这意味着将创建一个新的JmDNS实例。因此,我分别在中清理每个实例onDestroy
。
您的用例可能有所不同-您可能只想在清理线程尚未运行时启动它(使用Thread
的isAlive()
方法或某种类似的技术)。
这是一些示例代码。要欣赏“分别清理每个实例”部分,请执行以下步骤序列:
- 启动应用
- 按下返回按钮。您将在LogCat中看到清理操作
- 重新启动应用程序。
- 再次退出应用程序。现在,您将看到两组清理日志-第一个代表第一个实例的清理;第二个代表第一个实例的清理。第二集合对应于第二实例。
public class DelayedExitActivity extends Activity {
private static final String LOG_TAG = "DelayedExit";
private final Runnable longOperation = new Runnable(){
@Override
public void run() {
for (int i=0 ; i < 50; i++){
Log.d(LOG_TAG, "Iteration "+i);
try {
Thread.sleep(2 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
private Thread longThread ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onDestroy() {
if(longThread == null){
longThread = new Thread(longOperation);
}
longThread.start();
super.onDestroy();
}
}
以上是 在onDestroy中执行长时间运行的操作 的全部内容, 来源链接: utcz.com/qa/404319.html