【发布时间】: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