2014-05-17 6 views
0

내가 가진이 코드타이머 작업은 항상 false를 돌려

XML 변화를 확인
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; 
    } 

나는 기능은 IsChanged 전화 그것이 반환 alwayes 반환의 소요 거짓

어떤이의 잘못 코드 ?

답변

1

DoTimerTaskforXML의 run 메소드가 호출되기 전에 IsChanged 메소드가 완전히 실행됩니다. 그래서 기본값으로 false가되는 이유입니다. 동일한 호출에서 즉시 반환 값을 원할 경우 동기화 접근 방식을 사용해야합니다.

또는 (비동기 방식) AsyncTask class을 구현하면 백그라운드에서 xml을 구문 분석하는 데 가장 적합합니다. 그것은 두 개의 메소드 doInBackground와 onPostExecute를가집니다. 둘 다 무시하고 doInBackground 메서드에 구문 분석을 넣고 구문 분석이 완료되면 onPostExecute 콜백이 실행됩니다.

+0

하지만 다른 시간에이 타이머를 작동하고 싶습니다. 예를 들어, 처음으로 5 분 동안 두 번째로 10 분 동안 작동하고 싶습니다. – user3604882

+0

AsyncTask를 사용하여 어떻게 할 수 있습니까? – user3604882

+0

@ user3604882 코드 흐름을 이해하지 못했습니다. 하지만 IsChanged 메서드는 한 번만 호출된다고 가정하므로이 메서드에서 부울 값을 반환하지 않아도됩니다. isChanged = true로 설정하면 다른 메서드를 호출하여이를 기반으로 작업을 수행 할 수 있습니다. – essess

관련 문제