如何定期检查解析服务器上的更新?

时间:2014-05-18 22:14:23

标签: java android multithreading android-asynctask

Helly社区。我对Android很新,可能是网络和后端最大的菜鸟。 现在我有以下问题。

我正在构建一个简单的聊天应用程序,并希望我的应用程序检查Parse服务器以查找特定的消息parseobject。

获取对象,使用它们并删除它们可以正常工作。 如果我只做一次。

这是我从云端获取消息并将其添加到我的App Layout的方式。

ParseQuery<ParseObject> query = ParseQuery.getQuery("message");
            query.whereEqualTo("recipient", getRemote_id());

            query.findInBackground(new FindCallback<ParseObject>() {
              public void done(List<ParseObject> messages, ParseException e) {
                 if(messages != null){
                     Iterator itr = messages.iterator();
                      while(itr.hasNext()){
                          ParseObject message = (ParseObject)itr.next();

                         addMessageToLayout(message.getString("text"), "in", "new", "");  
                         try {
                            message.delete();
                        } catch (ParseException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                      } 
                 }

              }
            }); 

我希望我的应用程序始终检查新邮件。 我尝试过AsyncTask和while(true)循环。循环不断创建新的asynctask对象。 结果,应用程序不再反应和崩溃。

当我使用runnable类的实例时,我得到以下错误:NetworkOnMainThreadException,并且应用程序崩溃。

由于这个错误,我首先尝试使用asynctask。是不是一个可运行的对象运行在与主线程不同的线程上?

我尝试让线程休眠几秒钟,但是在异步任务的情况下,应用程序仍会崩溃。

问题可能如下:我使用anoher runnable对象更新我的应用中的一些动画。

我也尝试不使用任何类型的线程,因为解析方法已经在后台工作,所以他们可能甚至不需要。由于NetworkOnMainThreadException,应用程序再次崩溃。

/// _ ////

现在最奇怪的事情来了。如果我没有使用循环,只是在我第一次进入活动时检查消息我得到了NetworkOnMainThreadException,但随后应用程序以某种方式恢复到新打开的活动并从服务器加载我的消息。

在那个时间当然,UI被阻止了。不过,这是我现在能够让它发挥作用的唯一方法。

使用Handler和TimerTask工作,但是当我退出Activity时,我似乎无法关闭线程。

这是我的代码:

public void startLookingForMessages(){

        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {       
             @Override
             public void run() {

               handler.post(new Runnable() {
                  public void run() {  
                     new GetMessagesTask().execute();

                  }
                });
              }
        };
        timer.schedule(task, 0, 1000);

    }

我发现即使我在调用onStop()时尝试关闭线程或关闭while循环,我才会获得NetworkOnMainThreadException。如果我让线程做自己的事情,这意味着不要随时放入任何代码来阻止它,我的应用程序工作正常。 我怎么能克服这个问题?

我知道这有点长。但也许有人有同样的问题,可以在这里得到一些信息。

感谢您的帮助=)

1 个答案:

答案 0 :(得分:1)

不要这样做。只是不要。

考虑一下:您正在调用AsyncTask定期检查是否存在某些内容。现在,这变得相当昂贵。如果没有该消息,请考虑您浪费的电池和网络资源。因此,您浪费了大量资源。像这样做这不是一个好主意。你浪费了用户的资源。此外,您还需要一个在后台运行的服务,因为您的应用程序并不总是在运行。

解决此问题的好方法是使用Google Cloud Messaging。那么Google Cloud Messaging所做的就是它&#34; ping&#34;每当有更新时,设备。这使您的生活更轻松,因为您只需要检查您的应用是否已收到其中一个ping,并且还节省了电池和网络资源。

如果您在服务器端应用程序中使用PHP,则可以使用它来开始使用GCM和PHP:GCM with PHP (Google Cloud Messaging)

This page on Google's website也应该有助于实施它。

通过使用GCM,您还可以避免每隔x分钟有无限循环或检查更多信息。如果有新信息,您不必检查自己;当它可用时,它会ping你。