Android Long-Service Create bg 线程,我不知道这是怎么回事

标签 android multithreading service long-integer

基本上我正在为 android 开发一个 rss 提要,我想要一个更新程序服务,对于每个源,在特定时间获取提要。

想象一下:

来源 1 - 5 分钟 来源 2 - 10 分钟 来源 3 - 10 分钟

我构建了一个差异列表,只使用一个发出更新请求的线程。 数据结构保持如下:

Source1(下一个 sleep - 5),Source2(下一个 sleep - 0),Source 3(下一个 sleep 5)..等等..

我所做的是,我总是添加到提供者列表(包含 ID 和 URL),当 sleep 为 != 0 时,我订购更新(使用异步任务,我传递提供者列表以更新,而 asynctask 为我完成了这项工作,即……访问互联网、解析内容和更新数据库)

但是存在一个正在休眠的工作线程,只是为了将一组提供者分组并发送到 AsyncTask 进行更新。

什么问题.. 首先线程不休眠特定时间,线程必须休眠10分钟,我做了一个将分钟转换为milis的方法,即:

private static int MinutesToMilis(int minutes) { return minutes * 1000 * 60;    }

我正在使用 alogcat,这是我手机上的一个小部件,线程休眠了大约 25 分钟(WTF):|

我验证的另一件事是,当手机正在充电时,服务工作正常......

代码如下:

worker = new Thread(new Runnable()
    {
        @Override
        public void run() 
        {
            Provider[] enabledProviders = feedService.getAllProvidersEnabledData();     

            // Build a differential list from enabledProviders
            DifList<Provider> list = getListForProviders(enabledProviders);     

            //
            // Code starts here
            int sleep;              
            DifNode<Provider> header = list.getFirst();

            sleep = header.getInitial();
            LinkedList<Provider> data = new LinkedList<Provider>();
            Log.d(TAG, String.format("Worker thread started @ %s", now()));

            try
            {
                for(int idx = 0 ;   true    ; list.reorderFirst(), header = list.getFirst(), idx++)
                {
                    Log.d(TAG, String.format("Iteration %s with sleep %s", idx, sleep));

                    if(sleep > 0) {
                        Log.d(TAG, String.format("Next download in %s minutes", sleep));

                        // Suspend worker thread for sleep time
                        Thread.sleep(MinutesToMilis(sleep));

                        Log.d(TAG, "Worker thread waked up from sleep");
                    }

                    // Add to data
                    data.add(header.getKey());

                    // Set next sleep time
                    sleep = header.getDifference();                     


                    if(sleep != 0)
                    {
                        Log.d(TAG, "Worker preparing for update..");
                        //
                        // If difference to next is not 0 we dump data to async task
                        for(Provider p : data){
                            Log.d(TAG, String.format("Starting update %s @ %s", p.Name, now()));
                        }

                        Provider[] arrayData = new Provider[data.size()];
                        data.toArray(arrayData);

                        data.clear();
                        new UpdateBundleOfFeedsTask().execute(arrayData);
                    }


                }
            }       
            catch(InterruptedException ex)
            {
                Log.d(TAG, String.format("Worker thread was interrupted @ %s", now()));
                isRunning = false;
            }

            Log.d(TAG, String.format("Worker thread exit @ %s", now()));
        }
    });

最佳答案

你真的不应该那样做,即拥有一个永不消亡的线程。我强烈建议你看看警报:http://developer.android.com/reference/android/app/AlarmManager.html

一个好的方法是:

  • 设置一个重复的闹钟,也许每个客户端都有不同的pendingIntent,尽管在​​你的情况下,每 5-10 分钟一次只阅读一些 RSS 似乎有点太频繁了.
  • 实现一个广播接收器来监听您的警报设置的待定 Intent 。
  • 从广播接收器启动一个服务,启动一个工作线程从网络读取并保存到数据库。

关于Android Long-Service Create bg 线程,我不知道这是怎么回事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7166333/

相关文章:

android - 触摸edittext时如何使提示消失?

java - 在特定时间后执行某些代码

android - 在设备启动时从 init.rc 运行脚本时出现问题

android - 2 服务通讯

delphi - 如何将 (Delphi) OLE 服务器与第二个客户端重用?

android - ListView 在选中和未选中之间切换项目 - Android

android - 垂直 Android TabLayout 不能垂直滚动

android - 各种元素在同一行的 RecyclerView

c++ - 如何通过 Linux 的调度程序测量线程从繁忙的核心迁移的延迟?

javascript - #onmessage 和 #postmessage 如何在主线程和 HTML5 的 webworkers 之间进行通信?