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 是 运行 在另一个线程上?
Handler
s 运行 Runnable
s 在创建 Handler
的任何线程上。因此,如果您在主线程上创建 ArchiveHandler
,它将 运行 主槽上的 UpdateTimerCleanUp
代码。我不确定你的 archieveHistory()
方法到底做了什么,但我猜它需要足够长的时间 运行 导致由于阻塞主线程而导致应用程序无响应错误。
要解决这个问题,您应该使用一些适合您需要的后台执行方式(Executors、Threads 等)。
我有一段代码是每小时运行。该代码在设备上的本地 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 是 运行 在另一个线程上?
Handler
s 运行 Runnable
s 在创建 Handler
的任何线程上。因此,如果您在主线程上创建 ArchiveHandler
,它将 运行 主槽上的 UpdateTimerCleanUp
代码。我不确定你的 archieveHistory()
方法到底做了什么,但我猜它需要足够长的时间 运行 导致由于阻塞主线程而导致应用程序无响应错误。
要解决这个问题,您应该使用一些适合您需要的后台执行方式(Executors、Threads 等)。