android - 在 Android 中创建每小时运行的线程的最佳实践?
问题描述
因此,我正在尝试创建需要在 Android 应用程序中每小时运行的后台任务。这是一项相当繁重的任务,大约需要 5 到 10 分钟才能完成,现在它在 UI 线程上运行,这当然不好,因为它会挂起整个应用程序。我在 MainActivity onCreate 中尝试了以下操作:
new Thread(new Runnable() {
private Handler HeavyTaskHandler = new Handler(Looper.getMainLooper());
public void run(){
final TextView updatedTxt = findViewById(R.id.txt);
updatedTxt.post(new Runnable() {
@Override
public void run() {
updatedTxt.setText("Performing cleanup..");
}
});
HeavyTask(); // <-- This method runs for 5 - 10 minutes
updatedTxt.post(new Runnable() {
@Override
public void run() {
updatedTxt.setText("Done..");
}
});
HeavyTaskHandler.postDelayed(this, HeavyTaskCycle);
}
}).start();
我对上述有两个问题
- 第一次运行良好,任务在后台执行得很好,没有挂起UI线程。但是,在第一次和下一次运行之后,UI 线程在运行时再次挂起。我错过了什么?
- 请注意,在调用 HeavyTask() 方法之前,我尝试将 TextViews 文本设置为“Performing cleanup..” .. 这永远不会显示,只有在 HeavyTask() 方法完成后发生的“Done..”。我如何确保该消息也出现在之前?
解决方案
我最终从 MainActivity 执行了以下操作,它不会挂起应用程序
private void CreateCleanUpThread()
{
CleanUpThread = new Thread(new Runnable() {
public void run(){
try {
while(true) {
performingCleanup = true;
final TextView updatedTxt = findViewById(R.id.updated_txt);
runOnUiThread(new Runnable() {
@Override
public void run() {
updatedTxt.setText("Performing database history cleanup..");
}
});
HeavyTask(); // <-- This method runs for 5 - 10 minutes
runOnUiThread(new Runnable() {
@Override
public void run() {
updatedTxt.setText("Done..");
}
});
performingCleanup = false;
Thread.sleep(CleanUpCycle); // 1 hour wait time
}
} catch(Exception ex) {
System.out.println("Error in CreateCleanUpThread : " + ex.getMessage());
}
}
});
}
// onCreate in MainActivity
...
CleanUpThread.start();
当然不是最好的方法,但它现在有效并且会做。我认为应该转移到服务中。
推荐阅读
- c# - 需要使用 C# 在文本框中输入的自动完成来搜索子字符串或任何匹配的字符串
- amazon-web-services - 无法通过 Site-to-Site VPN 和 DMS 源数据库端点测试连接从本地 ping DMS 复制实例的私有 IP
- java - 编写方法来查找我的 ArrayList 中最大整数的索引时遇到问题
- react-native - 如何在odoo消息中添加附件ID
- oauth-2.0 - LinkedIn API v2 是否符合 OAuth 2.0 规范?
- python - 将此 QuerySet 解析为元组时导致效率低下的原因是什么?
- java - 如何从 JTextField 设置字体 TextArea 的大小并使用 RadioButoon 更改样式文本
- path - 为什么我们在使用 pip 命令之前包含路径
- r - 获取具有最大年份和最小月份的日期索引
- reactjs - 为什么我的字体很棒的图标一开始显示得很大,然后又更新到合适的大小?