每5秒向Web服务发送请求。

8
我想监听 SQL Server 数据库,以了解 Android 中的数据是否有更改,因此我想每隔 5 秒向 Web 服务发送请求,以了解新数据值。我该如何做?你能给个例子吗?

1
为什么不使用推送通知? - Raghunandan
我使用了(GCM)推送通知,但我想直接监听数据库以获取Android中的新数据。我可以这样做吗? - Rıdvan
4个回答

20

您可以使用AsyncTask来完成它。

public void callAsynchronousTask() {
    final Handler handler = new Handler();
    Timer timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {       
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {       
                    try {
                        PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                        // PerformBackgroundTask this class is the class that extends AsynchTask 
                        performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms
}

更多信息:如何在固定时间间隔后重复执行异步任务


我可以从AsyncTask扩展PerformBackgroundTask吗? - Rıdvan
是的,正如我所注释的 - PerformBackgroundTask 这个类是继承了 AsynchTask 的类。 - My God
你对此有什么看法,我能否使用汇集来获取数据,对服务器来说是否高效? - Rıdvan
每隔一段时间?我想要每5秒请求一次,并且我将在10台机器上安装此应用程序,每台机器都将同时工作,不要损坏服务器。 - Rıdvan
相同的概念。服务器负载可能会根据其容量增加,但不会造成损坏。 - My God
显示剩余3条评论

1

使用Service类,在该类中实现线程调度程序,每5秒发送一次请求。以下是代码片段:

public class ProcessingService extends Service {

private Timer timer = new Timer();


@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            sendRequest();
        }
    }, 0, 5000;//5 Seconds
}

@Override
public void onDestroy() {
    super.onDestroy();
    shutdownService();

}

}

0

使用此代码:

    ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    scheduler.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            // Hit WebService
        }
    }, 0, 5, TimeUnit.SECONDS);

-1

轮询通常不是一个好主意,因为它会在服务器上创建不必要的负载。在您的情况下,每个用户每分钟20个请求。

所以采用推送机制。这个想法是这样的,每当你收到一个推送消息,你就会调用Web服务来获取最新的数据。

这个链接会帮助你:推送而不是轮询 - 如何使用GCM更新应用程序


你说得对,这种方式对服务器来说并不高效。我使用了GCM API,它比轮询更好,但是当我使用GCM时,我必须输入推送的输入。我想监听数据库,如果某些数据值发生了变化,我需要获取新值。我该怎么做?你有什么想法吗? - Rıdvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接