基本上我正在为 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/