我有一项服务,定期从网站下载一些更新。 默认时间很长,大约10分钟,我使用AlarmManager启动此服务。
网络可以开启或关闭,如果服务中断,则应在网络返回后立即下载新闻,因为间隔时间很长,在最坏的情况下,您可能需要等待20分钟直到下次更新。
我制作了一个网络状态广播接收器,并且用很少的代码创建了一个NetworkListener接口:
public interface NetworkStateListener {
public void onNetworkOn();
public void onNetworkDown();
}
所以我的服务有这两种方法,可以知道网络何时开启或关闭。
我的想法如下:在onStart()方法中,我产生了一个新线程:如果网络处于关闭线程等待,否则下载。当调用onNetworkOn()时,我调用notify():
private boolean threadWaiting; //a flag so that I don't spawn multiple threads
public int onStartCommand(Intent intent, int flags, int startId) {
if(!threadWaiting){//if already a thread waiting do nothing and exit
Thread t = new Thread(new Runnable(){
@Override
public void run() {
synchronized(binder){
while(!isNetworkOn())
try {
threadWaiting = true;
binder.wait();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
// blocks until network connection is available
threadWaiting = false;
//... operations ...
这是onNetworkOn()方法:
public void onNetworkOn() {
synchronized(binder){
binder.notify();
}
这是正确的方法吗?
答案 0 :(得分:2)
恕我直言,这并不理想,因为你在内存中保持服务。另外,如果您的服务是这是正确的方法吗?
IntentService
,您将泄漏一个帖子,可能永远不会发现连接更改。
我会在BroadcastReceiver
广播的清单中设置CONNECTIVITY_ACTION
,最初禁用该接收器。如果在发生警报时,您发现没有连接,请启用该接收器。当接收方收到“我们有连接”广播时,让它呼叫startService()
向您的服务发送命令以进行工作,然后让接收器自行禁用。这样,您无需始终保持服务运行。
答案 1 :(得分:0)
解决: 我保留了一个布尔标志“我的服务中错过了更新”:
boolean missedUpdate = false;
然后在我的onStartCommand:
if(isNetworkOn()){
//do actual code
}else
missedUpdate = true;
在我的网络上:
public void onNetworkOn(){
if(missedUpdate){
//download updated news
// reset timer
missedUpdate = false;
}
}