代码之家  ›  专栏  ›  技术社区  ›  smatthewenglish

如何在Android应用程序中优雅地关闭所有活动并关闭所有正在运行的线程?

  •  -1
  • smatthewenglish  · 技术社区  · 6 年前

    目前,在我的每一项活动中,我都有这样的方法:

    private void registerReceiverClose(){
        Activity activity = this;
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("CLOSE_ALL");
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                activity.finish();
            }
        };
        registerReceiver(broadcastReceiver, intentFilter);
    }
    

    还有这个:

    @Override
    protected void onDestroy() {
        unregisterReceiver(broadcastReceiver);
        super.onDestroy();
    }
    

    它们由以下注销按钮触发:

        Button logout = findViewById(R.id.logout_button);
        logout.setOnClickListener(click -> {
            Intent intent = new Intent("CLOSE_ALL");
            this.sendBroadcast(intent);
        });
    

    有一件事我肯定不是以正确的方式结束的,那就是我有这样的代码:

    private static final ScheduledExecutorService pollingScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
    
    private static final Object lock = new Object();
    private static ScheduledFuture<?> currentRunningTask;
    
    public void longPoll() {
        synchronized (lock) {
            if (currentRunningTask != null) {
                currentRunningTask.cancel(true);
            }
            try {
                currentRunningTask = pollingScheduledExecutor.scheduleAtFixedRate(this, 0, 3, TimeUnit.SECONDS);
            } catch (Exception ignored) {
            }
        }
    }
    
    public void request() {
        Thread requestThread = new Thread(this);
        requestThread.start();
    }
    

    即使在我死后也会继续发出请求 认为 我应该注销,这会导致服务器出错。

    1 回复  |  直到 6 年前
        1
  •  1
  •   vatbub    6 年前

    你可以把轮询代码包装在 Service . 然后可以使用停止此服务

    Intent intent = new Intent(MainActivity.this, MyService.class); 
    stopService(intent);  
    

    在服务内部,您可以覆盖 onDestroy() 清理资源。