【问题标题】:How Do I periodically Check For Updates on a Parse Server? [duplicate]如何定期检查 Parse 服务器上的更新? [复制]
【发布时间】:2014-05-18 22:14:22
【问题描述】:

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

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

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

这就是我从云端获取消息并将它们添加到我的应用布局的方式。

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 对象。 结果应用程序不再反应并崩溃。

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

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

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

问题可能如下:我正在使用另一个可运行对象来更新我的应用程序中的一些动画。

我还尝试不使用任何类型的线程,因为解析方法已经在后台运行,所以他们可能甚至不需要一个。由于 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。如果我让线程做它自己的事情,这意味着任何时候都不要输入任何代码来停止它,我的应用程序可以正常工作。 我该如何克服这个问题?

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

已经感谢您的帮助 =)

【问题讨论】:

  • 解决了我看这个问题stackoverflow.com/questions/17032024/…的问题
  • 如果您不再需要帮助,请删除此问题。
  • 编辑:它仍然不能像我预期的那样工作。我发现只有当活动中的任何东西试图关闭检查消息的线程时,我才会得到 NetworkOnMainThreadException。例如我的 while(running) 循环。我通过在 onStop() 中将 running 设置为 false 来关闭它。

标签: java android multithreading android-asynctask


【解决方案1】:

不要这样做。只是不要。

想一想:你打电话给AsyncTask 是为了定期检查是否有东西。现在,这变得相当昂贵。如果该消息不存在,请考虑您浪费的电池和网络资源。因此,您浪费了大量资源。这样做不是一个好主意。你浪费了用户的资源。此外,您还需要在后台运行服务,因为您的应用不会一直在运行。

解决此问题的一个好方法是使用Google Cloud Messaging。因此,Google Cloud Messaging 所做的是每次有更新时都会“ping”设备。这让您的生活更轻松,因为您只需检查您的应用是否收到了这些 ping 之一,它还可以节省电池和网络资源。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多