我有點新的java編程爲Android AsynTasks ...多次調用GCE
但是,我看到他們的觀點(讓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請求龍蝦對象,然後立即嘗試在下一行代碼中使用它(例如,龍蝦龍蝦=新的GetLobsterAsyncTask()。execute(lobsterName); lobster.dance(); ),你會收到一個例外。所以,不僅你的龍蝦「不跳舞」,它還會「向你拋出NullPointerException」。
但它有點開放的解釋。因爲我從來沒有對上述結果的使用產生任何問題,所以馬上。
當我在上面的代碼後面添加另一個調用時,我似乎得到間歇性問題,在同一個AsynTask中調用其他GCE方法 - 注意,不使用其他調用的結果。
myMethod2 meMethod2Command = apiServiceHandle.sample().myMethod2();
newthing2.setthing(myMethod2Command.execute().getthing());
那麼,有沒有一個硬性的規則的地方,說我們只能做1個來電,每AsynTask GCE的方法呢? AsyncTask doInBackground()中的行是按順序執行還是可能這些GCE .execute()調用是並行進行的? 在我重寫一對AsyncTasks以便它們只包含1個調用(並且有一長串onPostExecute()堆積起來)之前,我想確保我理解它...
它變得複雜因爲我有一堆電話打電話甚至是一個循環。我想讓我的GCE方法。所以第二個問題是:對GCE方法進行循環調用的任何建議?我也讀過AsynTask只能執行一次。
更新:我現在只是假設我們每個Asynctask只能打1個GCE呼叫。這給我帶來了一些有趣的挑戰,因爲我需要在我的應用程序的某些情況下做出一些。
無論如何,它對我來說是一個被調用的asynctasks循環,其中每個被調用的asynctask最終都會在onPostExecute內調用另一個asynctasks循環。
即。 psuedocode:
loop
asynctask 1 defined {
do inbackground {
...;
}
onPostExecute {
loop
asynctask 2 defined {
doinbackground {
...;
};
onPostExecute {
};
};
asynctask2.execute;
end loop;
};
};
asynctask1.execute;
end loop;
現在真正的挑戰是我需要知道他們什麼時候全部完成了,然後再做一次手術。
我已經看到了一些有關任務數組和任務檢查的建議,或者調用一個函數來增加計數。
讓我知道,如果你有其他的想法...
---最後更新 結束了一個線程跟蹤數去。在每次執行之前,我將遞增1.在每個postexecute中,我遞減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
}
}
}
雖然此鏈接可能回答問題,但最好在此處包含答案的基本部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – nempoBu4
不要鏈接不回答他的問題。上面有幾個問題。我的答案只是試圖回答他的最後一個問題,任何建議呼籲GAE的呼叫?我建議一個IntentService。這些鏈接只提供了一些關於GAE的信息,並且它在Android客戶端中使用。 – Boo
延斯你甚至讀過我的回答嗎?我已經刪除了問題上面的單詞問題。但你真的應該閱讀你正在評論的文章。 – Boo