2012-09-20 53 views
4

我有一個線程運行在一個應用程序的服務中,該應用程序從之前用webview登錄到的頁面讀取數據。該線程工作正常。Android服務與重複線程在部分喚醒鎖定的背景

現在我想重複這個線程週期性地說,一分鐘,甚至當手機睡着了/屏幕關閉。我知道我可能會用wake_lock去解決它,但我不知道如何。

我在這裏有3個問題。我嘗試用while(true)sleep(60000)...重複該線程,但在電話屏幕熄滅後停止線程。有沒有更好的辦法?

然後,我還想比較字符串數爲零。如果字符串計數大於零,則爲xxx。

任何幫助非常感謝!

Thread downloadThread = new Thread() {      
      public void run() {          
       Document doc;  
       doc = null; 


      try {     
       final String url = "https://xxx.xxx.xx"; 


       // -- Android Cookie part here -- 
       CookieSyncManager.getInstance().sync(); 
       CookieManager cm = CookieManager.getInstance(); 

       String cookie = cm.getCookie(url);   

       // Jsoup uses cookies as "name/value pairs" 
       doc = Jsoup.connect("https://xxx.xxx.xx").cookie(url, cookie).get(); 

       Elements elements = doc.select("span.tabCount"); 
       String count = elements.first().text(); 



       Log.d(TAG, "wart"+(count)); 
       Log.d(TAG, "wartcookiedate:"+(cookie)); 





      } catch (IOException e) {       
       e.printStackTrace();       
      }             
     }              
    };               
    downloadThread.start(); 

這是我第二次嘗試下面的代碼。當用戶已經登錄時,它可以完美工作。我現在的問題是,在應用程序啓動時,字符串「count」將返回null,因爲用戶尚未登錄。因此將拋出一個異常,它會停止整個計劃的任務執行程序。如果「count」爲空,是否有辦法重新啓動它?

scheduleTaskExecutor= Executors.newScheduledThreadPool(5); 

    // This schedule a task to run every 10 seconds: 

    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 

      Document doc;  
      doc = null; 


      try {     
       final String url = "https://xxx.xxx.xx"; 


       // -- Android Cookie part here -- 
       CookieSyncManager.getInstance().sync(); 
       CookieManager cm = CookieManager.getInstance(); 

       String cookie = cm.getCookie(url); // returns cookie for url 


       // Jsoup uses cookies as "name/value pairs" 
       doc = Jsoup.connect("https://xxx.xxx.xx").cookie(url, cookie).get(); 

       Elements elements = doc.select("span.tabCount"); 
       String count = elements.first().text(); 



       Log.d(TAG, "wart"+(count)); 
       Log.d(TAG, "wartcookiedate:"+(cookie)); 





      } catch (IOException e) {       
       e.printStackTrace();       
      }          


     } 
    }, 0, 10, TimeUnit.SECONDS); 

回答

4

不要使用一個明確的線程與while + sleep模擬定時器。這是醜陋的和不必要的。有更多優雅的方法可以自動計劃每x時間單位的任務,如ScheduledThreadPoolExecutor

+0

謝謝!我怎麼能去wake_lock和字符串比較呢? – SunnySonic

+0

@SunnySonic:你應該先嚐試一下,看看'ScheduledThreadPoolExecutor'是否與你之前的代碼有相同的問題。 – Tudor

+0

感謝您的提示。閱讀完一下後,即使是在我的主要活動中,我也可以創建它,並不一定需要爲此提供單獨的服務。會嘗試一下,然後回到這裏。非常感謝! – SunnySonic