2014-11-17 43 views
0

我有點新的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 
     } 
    } 
} 

回答

0

(編輯:我根據nempoBu4的評論編輯我的答案)

這裏的AppEngine上端點的一些信息,並使用端點在Android客戶端: Udacity有一個課程涵蓋App Engine的可能是值得你的一些時間。 https://www.udacity.com/course/ud859

您應該閱讀他們的Android客戶端代碼,看看他們是如何在客戶端使用端點方法的。它在GitHub上。該應用程序被稱爲會議中心。 https://github.com/udacity/conference-central-android-app

那麼是否有一個硬性的規則說,我們只能對每個AsynTask調用GCE方法1次? 我不這麼認爲,我已經使用沒有問題的端點從後臺線程對我的後端進行了多次調用。我唯一擔心的是在一個AsyncTask中完成這個工作,這是完成所需的時間。 「AsyncTask被設計成圍繞Thread和Handler的助手類,並不構成通用的線程框架,AsyncTasks理想地應該用於短操作(最多幾秒鐘)。」根據AsyncTask上的Android參考。

對GCE方法進行循環調用的任何建議? 我已經建立了一個IntentService來消費後臺線程中的端點方法。這是非常直接的使用,只需按照開發人員指南。它會將調用放到隊列中,然後一旦服務清空隊列,就會關閉自身。您可以設置廣播管理器來處理結果。

祝你好運。

+0

雖然此鏈接可能回答問題,但最好在此處包含答案的基本部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – nempoBu4

+0

不要鏈接不回答他的問題。上面有幾個問題。我的答案只是試圖回答他的最後一個問題,任何建議呼籲GAE的呼叫?我建議一個IntentService。這些鏈接只提供了一些關於GAE的信息,並且它在Android客戶端中使用。 – Boo

+0

延斯你甚至讀過我的回答嗎?我已經刪除了問題上面的單詞問題。但你真的應該閱讀你正在評論的文章。 – Boo