我有两个AsyncTasks。其中每个都有一个方法从后端服务获取信息,填充本地SQLite表,然后调用第三个AsyncTasks。
第一个AsyncTasks必须每2小时调用一次 第二个AsyncTasks必须每8小时调用一次
为此,我使用TimerTask:
final Handler handlerBS = new Handler();
Timer timerBS = new Timer();
TimerTask taskBS = new TimerTask() {
@Override
public void run() {
handlerBS.post(new Runnable() {
public void run() {
new FetchBackendData1Task().execute();
}
});
}
};
timerBS.schedule(taskBS, 0, 1000 * 60 * 60 * 8);
final Handler handlerBS2 = new Handler();
Timer timerBS2 = new Timer();
TimerTask taskBS2 = new TimerTask() {
@Override
public void run() {
handlerBS2.post(new Runnable() {
public void run() {
new FetchBackendData2Task().execute();
}
});
}
};
timerBS2.schedule(taskBS2, 0, 1000 * 60 * 60 * 8);
主要思想是:
AsyncTasks 1: 1)开始 2)呼叫后端 3)从后端返回 4)填充表格 5)检查AsyncTasks 2是否已完成。 5-1)如果完成,请调用AsyncTasks 3。 5-2)如果不是,不要做任何事情
AsyncTasks 2: 1)开始 2)呼叫后端 3)从后端返回 4)填充表格 5)检查AsyncTasks 1是否已完成。 5-1)如果完成,请调用AsyncTasks 3。 5-2)如果不是,不要做任何事情
AsyncTasks 3: 1)从填充AsyncTasks 1的表中获取数据 2)从填充AsyncTasks 2的表中获取数据 3)合并数据 4)使用数据。
我尝试了两个想法
选项1)在Application中为每个AsyncTasks放置一个布尔标志。每个AsyncTasks启动时,将标志设置为True。当其中一个AsyncTasks完成时,我检查另一个的标志。如果是假呼叫AsyncTasks 3,如果没有,不做任何事情
选项2)使用synchronized flag
设置AsyncTasks 3的main方法如果我在调试模式下运行应用程序,它可以正常工作。
但是如果我在正常模式下运行应用程序,第一次(当两个AsyncTasks同时启动时)会发生一些事情,而第三次AsyncTasks则不会被调用。
如果我检查表格,两者都已填写,所以我认为同步存在问题
我尝试在第二个AsyncTask上放一点延迟。它有效(但我不能使用这种方法)。
根据这些测试,我认为Synchro存在一些问题
我的问题是: 1)其中一种方法是对的吗? 2)还有另一种更好的方法吗? 3)有人可以知道为什么第一次执行它不起作用吗?
感谢您的时间,对不起,如果我的英语不是最好的