使两个AsyncTasks调用同步方法

时间:2015-08-25 12:10:31

标签: android multithreading sqlite android-asynctask

我有两个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)有人可以知道为什么第一次执行它不起作用吗?

感谢您的时间,对不起,如果我的英语不是最好的

0 个答案:

没有答案