【问题标题】:android service with repeating thread in background with partial wake lock带有部分唤醒锁的后台重复线程的android服务
【发布时间】:2012-09-20 17:29:52
【问题描述】:

我有一个线程在应用程序的服务中运行,该线程从以前使用 web 视图登录的页面中读取数据。该线程工作正常。

现在我想定期重复这个话题,比如一分钟,即使手机处于睡眠状态/屏幕关闭时也是如此。我知道我可能不得不使用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);

【问题讨论】:

    标签: java android multithreading service wakelock


    【解决方案1】:

    不要使用带有while + sleep 的显式线程来模拟计时器。这是丑陋和不必要的。还有更优雅的方法可以每隔 x 个时间单位自动安排任务,例如 ScheduledThreadPoolExecutor

    【讨论】:

    • 谢谢!!如何进行唤醒锁和字符串比较?
    • @SunnySonic:你应该先试试看ScheduledThreadPoolExecutor是否和你之前的代码有同样的问题。
    • 感谢您的提示。在阅读了一下之后,即使在我的主要活动中,我也可以创建它,并且不一定需要单独的服务。将尝试并回到这里。非常感谢!
    • 我用了你的小费,它似乎工作得很好,但给我留下了另一个问题。请查看我对第一篇文章的编辑。
    • @SunnySonic:你为什么不检查字符串是否为空,在这种情况下什么也不做?
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多