Задача таймера всегда возвращает false

у меня есть этот код

ischanged = false;
    public void doTimerTaskforXML(final GeneralObject Gen_Obj) {
        XMLTimerTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        String NewXML = "";
                        XMLParser parser = new XMLParser();
                        NewXML = parser.getXmlFromUrl(Gen_Obj.URL);
                        if (NewXML != null && NewXML != ""
                                && NewXML.length() > 0) {
                            if (!Gen_Obj.XML.equals(NewXML)
                                    || Gen_Obj.XML.length() != NewXML.length()) {
                                ischanged = true;
                                Log.i(TAG, "XMl has been changed");
                            }
                        }
                    }
                });
            }
        };
        XMLTimer.schedule(XMLTimerTask, 0, 60000);
        Log.i(TAG, "XNL not change");
    }

    public boolean IsChanged(GeneralObject Gen_Obj) {
        doTimerTaskforXML(Gen_Obj);
        Log.i(TAG, "ischanged= " + ischanged);
        return ischanged;
    }

которые проверяют изменение xml

Когда я вызываю функцию IsChanged и возвращаю ее, она всегда возвращает false

что не так в этом коде?


person user3604882    schedule 17.05.2014    source источник


Ответы (1)


Похоже, что метод IsChanged полностью выполняется до вызова метода run doTimerTaskforXML. и поэтому вы получаете значение по умолчанию как false. Вам нужно использовать подход синхронизации, если вы хотите, чтобы возвращаемое значение было немедленно в том же вызове.

В качестве альтернативы (асинхронный подход) вы можете реализовать класс AsyncTask, который лучше всего подходит для парсинг xml в фоновом режиме. Он имеет два метода doInBackground и onPostExecute. Вам придется переопределить их оба, поместить свой синтаксический анализ в метод doInBackground, и когда синтаксический анализ будет выполнен, будет запущен обратный вызов onPostExecute.

person essess    schedule 17.05.2014
comment
Но я хочу, чтобы этот таймер работал в разное время, например, первый раз на 5 минут, второй раз на 10 минут и так далее. - person user3604882; 20.05.2014
comment
Как я могу это сделать с помощью AsyncTask? - person user3604882; 20.05.2014
comment
@user3604882 user3604882 я не понял вашего кода. Но я предполагаю, что метод IsChanged вызывается только один раз, поэтому вы можете избежать возврата какого-либо логического значения из этого метода. Вместо этого вызовите другой метод, когда вы установите isChanged = true, чтобы выполнить действия на основе этого. - person essess; 20.05.2014