0

我有一个 android 应用程序,其中包含一个向用户显示信息的主要活动。当主要活动开始时,将创建一个服务,该服务每 10 秒检查一次 Web 服务 - 如果 WS 返回答案,则会弹出通知。主要活动和服务之间没有任何联系(除了我希望它们一起启动)。问题是活动的工作非常缓慢 - 因为服务正在运行。

我应该如何解决?我尝试使用 IntentService 但他在 10 秒后死亡。

我正在使用的代码:

@Override
public void onCreate() {    

super.onCreate();
context = this.getApplicationContext();
mPeriodicEventHandler = new Handler();
mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
}

private Runnable doPeriodicTask = new Runnable()
{
    public void run() 
    {
        NotificationServices.Notification();
        mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT);
    }
 };
4

4 回答 4

0

您的 Handler 正在主 UI 线程中执行任务,这可能会影响您的 Activity 的 UI 甚至导致 ANR。

我会建议创建一个新的 HandlerThread 并在那里发布你的任务。

但是,请确保您确实希望每 10 秒提取一次数据。这对于移动互联网和设备功耗来说是昂贵的。

考虑使用Persistent ConnectionGoogle Cloud Messaging

于 2012-09-04T08:21:25.087 回答
0

请参阅API Demos中的前台服务控制器示例,并在更新 web 服务时更新挂起事件。

还可以考虑使用Asynctask

我希望这有帮助 :)

于 2012-09-05T04:10:24.597 回答
0

我建议您使用 GCM 即 c2dm 而不是轮询,这是 c2dm 设计的场景......

作为参考,请检查这些链接,您肯定会喜欢使用它

http://developer.android.com/guide/google/gcm/index.html

于 2012-09-04T08:18:39.500 回答
0

使用 Handler 我们可以做到这一点

final Handler handler = new Handler();
        Runnable r = new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                handler.postDelayed(r, 10000);
            }
        };
        handler.postDelayed(r, 0);
于 2012-09-04T08:35:14.393 回答