7

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

如果我使用 aThread来执行此操作,我onDestroy()将立即返回;但是 Thread 引用会发生什么?我正在寻找关于我需要在这里注意的任何影响/陷阱/绊脚石的建议,因为我假设即使在 Activity 被销毁后该过程仍然存在。


背景:

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

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

4

2 回答 2

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();
        }
    }
    
于 2012-03-05T09:19:11.747 回答
0

尝试启动您的线程onBackPressed()并在您的线程完成时调用destroy()

于 2012-02-28T09:28:52.037 回答