Runnable 在 Android 上挂起 UI 线程

Runnable hangs UI thread on Android

我有一段代码是每小时运行。该代码在设备上的本地 SQLite 数据库上执行一些 SQL 任务。有时这个任务比其他任务稍微麻烦一些,当它出现时,应用程序会挂起足够长的时间,以至于 "is not responding" 对话框会打开,让我可以选择等待或关闭应用程序。

这是我的代码

UpdateTimerCleanUp = new Runnable() {
    @Override
    public void run() {
        TextView updatedTxt = findViewById(R.id.updated_txt);
        updatedTxt.setText("Performing database history cleanup..");
        archive.archieveHistory();
        ArchiveHandler.postDelayed(UpdateTimerCleanUp, CleanUpCycle);
    }
};
ArchiveHandler.postDelayed(UpdateTimerCleanUp, CleanUpCycle);

我正在使用处理程序每​​小时调用 运行nable (CleanUpCycle)。那部分有效,但为什么它会挂起我的 UI?据我了解,运行nable 是 运行 在另一个线程上?

Handlers 运行 Runnables 在创建 Handler 的任何线程上。因此,如果您在主线程上创建 ArchiveHandler,它将 运行 主槽上的 UpdateTimerCleanUp 代码。我不确定你的 archieveHistory() 方法到底做了什么,但我猜它需要足够长的时间 运行 导致由于阻塞主线程而导致应用程序无响应错误。

要解决这个问题,您应该使用一些适合您需要的后台执行方式(Executors、Threads 等)。