cur*_*zen 6 java lifecycle multithreading android jmdns
我有一个"长期运行"的清理操作,我需要在onDestroy()我的操作中执行Activity.做这个的最好方式是什么?
如果我用a Thread来做这件事,我onDestroy()会马上回来; 但是线程参考会发生什么?我正在寻找关于我需要注意的任何含义/陷阱/跳线的建议,因为我认为即使在Activity被销毁之后该过程仍然存在.
我在我的应用程序中使用JmDNS.当用户完成我的应用程序后,我想清理JmDNS实例.我这样做是使用类的close()方法JmDNS.但是,此方法需要5秒以上才能完成.结果,用户Activity在触摸后退键后长时间看到我的屏幕.
我还没弄清楚为什么close()需要这么长时间,但同时我也意识到我真的不需要等待近距离成功完成.我所需要的是一种"触发"关闭并完成它的方法.
我最终做了我在问题中所要求的事情 - 我开始Thread在onDestroy().
我必须考虑的一种情况是,用户在长时间运行完成之前重新打开我的应用程序。在我的应用程序中,这意味着创建了一个新的 JmDNS 实例。因此,我分别清理onDestroy.
您的用例可能有所不同 - 您可能希望仅在清理线程尚未运行时才启动它(使用 的Thread方法isAlive()或某种此类技术)。
这是一些示例代码。要了解“分别清理每个实例”部分,请执行以下步骤序列:
再次退出应用程序。现在,您将看到两组清理日志 - 第一个代表第一个实例的清理;第二个代表第一个实例的清理。以及对应于第二实例的第二组。
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();
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2056 次 |
| 最近记录: |