在onDestroy中执行长时间运行的操作

cur*_*zen 6 java lifecycle multithreading android jmdns

我有一个"长期运行"的清理操作,我需要在onDestroy()我的操作中执行Activity.做这个的最好方式是什么?

如果我用a Thread来做这件事,我onDestroy()会马上回来; 但是线程参考会发生什么?我正在寻找关于我需要注意的任何含义/陷阱/跳线的建议,因为我认为即使在Activity被销毁之后该过程仍然存在.


背景:

我在我的应用程序中使用JmDNS.当用户完成我的应用程序后,我想清理JmDNS实例.我这样做是使用类的close()方法JmDNS.但是,此方法需要5秒以上才能完成.结果,用户Activity在触摸后退键后长时间看到我的屏幕.

我还没弄清楚为什么close()需要这么长时间,但同时我也意识到我真的不需要等待近距离成功完成.我所需要的是一种"触发"关闭并完成它的方法.

cur*_*zen 3

我最终做了我在问题中所要求的事情 - 我开始ThreadonDestroy().

我必须考虑的一种情况是,用户在长时间运行完成之前重新打开我的应用程序。在我的应用程序中,这意味着创建了一个新的 JmDNS 实例。因此,我分别清理onDestroy.

您的用例可能有所不同 - 您可能希望仅在清理线程尚未运行时才启动它(使用 的Thread方法isAlive()或某种此类技术)。

这是一些示例代码。要了解“分别清理每个实例”部分,请执行以下步骤序列:

  1. 启动应用程序
  2. 按后退按钮。您将在LogCat中看到清理操作
  3. 重新启动应用程序。
  4. 再次退出应用程序。现在,您将看到两组清理日志 - 第一个代表第一个实例的清理;第二个代表第一个实例的清理。以及对应于第二实例的第二组。

    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)