当前位置: 首页 > 面试题库 >

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

仉明知
2023-03-14
问题内容

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

如果我使用a
Thread这样做,我onDestroy()将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。

背景:

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

我还没有弄清楚为什么close()花那么长的时间,但是与此同时,我也意识到我真的不需要等待收盘成功完成。我需要的是一种“触发”关闭并完成操作的方法。


问题答案:

我最终完成了我在问题中提出的要求-我开始在Thread中执行长期运行的操作onDestroy()

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

您的用例可能有所不同-您可能只想在清理线程尚未运行时启动它(使用ThreadisAlive()方法或某种类似的技术)。

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

  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();
    }
    

    }



 类似资料:
  • 问题内容: 我正在用node.js编写游戏服务器,某些操作涉及服务器部分的大量计算。在运行这些计算时,我不想停止接受连接- 当node.js不支持线程时,如何在后台运行它们? 问题答案: 我个人不能保证任何一种,但是如果您热衷于进行工作,那么节点模块页面上列出了针对节点的WebWorkers API的几个独立实现。 : http://github.com/cramforce/node-worker

  • 我目前使用的是mysql 我有两个名为person和zim_list_id的表,这两个表都有超过200万行

  • 问题内容: 我有一个运行长时间运行的作业的Web服务(大约几个小时)。我正在使用Flask,Gunicorn和nginx进行开发。 我正在考虑做的事情是拥有一条需要很长时间才能完成的路由,调用一个创建线程的函数。然后,该函数将向路径返回一个GUID,并且路径将返回一个URL(使用GUID),用户可以使用该URL来检查进度。我正在将线程设为守护程序(thread.daemon = True),以便如

  • 问题内容: 我有一个用JAX- RS实现的REST服务。有些操作需要很长时间才能完成,可能需要15到30分钟。对于这些情况,我倾向于派遣一个后台线程来处理长时间运行的操作,然后立即以HTTP状态202 ACCEPTED进行响应。响应将包含一个带有URL的位置标头,客户端可使用该标头来轮询进度。 这种方法需要创建线程来处理长时间运行的操作,以便可以立即返回202 ACCEPTED。我也知道在Java

  • 问题内容: 我有一个http服务器(使用启动),我想做一些操作。 我该怎么做(在Linux上)?在ctrl-C的情况下可以进行那些操作吗? 我不熟悉Unix信号,因此答案可能很简单。 问题答案: 您可以使用信号包订购TERM和INT信号。但是请注意,只有在明确终止进程时才发送这些信号。正常退出(由流程本身启动)不涉及任何信号。我认为,对于正常退出,只需在主例程中执行某些操作即可(该例程应该生成工作

  • 每个人在最新的更新之后,Studio在运行应用程序之前已经运行了很长时间(3-40分钟)“运行Gradle Build”。如何治疗?当前Studio版本:1.3。2.