2012-09-20 19 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