【问题标题】:multiple calls to GCE within 1 AsyncTask在 1 个 AsyncTask 内多次调用 GCE
【发布时间】:2014-11-17 06:05:23
【问题描述】:

我对 Android 的 java 编程中的 AsynTasks 有点陌生...

但是,我明白他们的意思(让 UI 继续,同时发生缓慢的操作)

我设置了 GCE(Google Cloud Endpoint)API。要从 android 应用程序访问它,它必须根据我所阅读的内容在 AsynTask 中执行。

我的困惑在于在返回 onPostExecute 之前 AsyncTask 中的限制究竟是什么?

显而易见的用途是调用一次 API。
所以像:

final myAPI.Builder builder = newmyAPI.Builder(
        AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null);      
builder.setApplicationName("mine");

AsyncTask<String, Void, com.appspot.myapp.myAPI.model.sample> publishAPItask =
    new AsyncTask<String, Void, com.appspot.myapp.myAPI.model.sample> () {
        @Override
        protected com.appspot.myapp.myAPI.model.sample doInBackground(String... strings) {
            // Retrieve service handle.
            myAPI apiServiceHandle = CloudEndpointUtils.updateBuilder(builder).build();
            try {                       
                myMethod myMethodCommand = apiServiceHandle.sample().myMethod();
                newthing.setthing(myMethodCommand.execute().getthing());
                ...

最后一行执行,但也已经引用了结果。我读过那是一个禁忌。真的吗?来自here 的引用是:

如果您需要使用任务应返回的对象,请使用任务的 onPostExecute 覆盖方法。如果您使用 AsyncTask 从 API 请求 Lobster 对象,然后 > 然后立即尝试在下一行代码中使用它(例如,Lobster lobster = new GetLobsterAsyncTask().execute(lobsterName); lobster.dance(); ),您将收到异常。因此,您的龙虾不仅会“不跳舞”,还会“向您抛出 NullPointerException”。

但它对解释有点开放。由于我对上述结果的使用从未遇到过问题,所以马上。

当我在上述代码之后添加另一个调用时,我似乎遇到了间歇性问题,在同一个 AsynTask 中调用其他 GCE 方法 - 请注意,不使用其他调用的结果。

myMethod2 meMethod2Command = apiServiceHandle.sample().myMethod2();
newthing2.setthing(myMethod2Command.execute().getthing());

那么是否有一个硬性规则规定我们每个 AsynTask 只能调用 1 次 GCE 方法? AsyncTask doInBackground() 中的行是否按顺序执行,或者这些 GCE .execute() 调用是否可能并行进行? 在我重写几个 AsyncTask 以使它们每个只包含 1 个调用(并且堆积了一长串 onPostExecute() )之前,我想确保我理解它......

这对我来说变得很复杂,因为我有很多调用甚至是循环调用。我想使用我的 GCE 方法。所以第二个问题是:对循环调用 GCE 方法有什么建议吗?我也读过 AsynTask 只能执行一次。

更新:我现在假设每个 Asynctask 只能进行 1 次 GCE 调用。这给我带来了一些有趣的挑战,因为我需要在我的应用中的特定情况下进行一些挑战。
无论如何,对我来说,结果是一个 asynctasks 循环被调用,每个 asynctask 被调用,最终在其 onPostExecute 中调用另一个 asynctasks 循环。

即。伪代码:

loop
  asynctask 1 defined { 
    do inbackground {
    ...;
    }
    onPostExecute {
      loop
        asynctask 2 defined {
          doinbackground {
            ...;
          };
          onPostExecute {
          };
        };
        asynctask2.execute;
      end loop;
    };
  };
  asynctask1.execute;
end loop;

现在真正的挑战是,我需要知道它们什么时候都完成了,然后再进行另一项操作。
我已经看到了一些关于一系列任务和检查它们的状态的建议,或者调用一个函数来增加一个计数。
如果您有其他想法,请告诉我...

--- 最终更新 结束了线程跟踪器计数。在上面每次执行之前,我递增 1。在每次执行后,我递减 1。当跟踪器的计数为 0 时,我知道我可以调用所需的最终操作。

private class threadtracker {
    public int todo;

    public threadtracker (String grpid) {
        todo = 0;
    }

    public void add(int adder) {
        todo = todo + adder;
        Log.v(TAG, " threads:" + todo);
    }

    public void subtract(int subber) {
        todo = todo - subber;
        Log.v(TAG, " threads:" + todo);

        if (todo == 0) {
           //do final operation
        }
    }
}

【问题讨论】:

    标签: java android android-asynctask google-cloud-endpoints


    【解决方案1】:

    (编辑:我根据 nempoBu4 的评论编辑了我的答案)

    以下是有关 AppEngine Endpoints 和在 Android 客户端中使用 Endpoints 的一些信息: Udacity 有一门涵盖 App Engine 的课程,可能值得你花一些时间。 https://www.udacity.com/course/ud859

    不过,您应该阅读他们的 Android 客户端代码,看看他们如何在客户端中使用 Endpoint 方法。它在 GitHub 上。该应用程序称为会议中心。 https://github.com/udacity/conference-central-android-app

    那么是否有一个硬性规则规定我们每个 AsynTask 只能调用 1 次 GCE 方法? 我不这么认为,我已经使用端点从后台线程多次调用我的后端,没有任何问题。我唯一担心在单个 AsyncTask 中执行此操作的是完成所需的时间。 “AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,不构成通用线程框架。理想情况下,AsyncTasks 应该用于短操作(最多几秒钟)。”根据 AsyncTask 上的 Android 参考。

    对循环调用 GCE 方法有何建议? 我已经设置了一个 IntentService 来在后台线程中使用端点方法。使用起来非常简单,只需遵循开发人员指南即可。它将对服务的调用放入队列中,然后一旦服务清空队列,它将自行关闭。您可以设置广播管理器来处理结果。

    祝你好运。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 不,链接不能回答他的问题。上面问了几个问题。我的回答只是试图回答他的最后一个问题,有什么建议可以循环调用 GAE 吗?我建议使用 IntentService。这些链接只是提供了一些关于 GAE 的信息,它在 Android 客户端中使用。
    • Jens 你有没有看我的回答?我已经删除了问题上方的问题一词。但是你真的应该阅读你正在评论的文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多