[英]Running multiple threads in Asynctask
我從一個URL獲取信息,並將該信息發送到多個URL。 我在AsyncTask的“ for”上運行它,但事實是,如果其他操作未返回錯誤或成功,則該操作不會繼續。 所以我想在AsyncTask-ception中做到這一點,但是可惜Android不允許我這樣做。
因此,我有兩個AsyncTask類。 那是我發送到網站的課程:
class SendTo extends AsyncTask <Object,Object,String>{
@Override
protected String doInBackground(Object... strings) {
....
}
}
那是我從網站獲得的任務:
class GetFrom extends AsyncTask <Object,Object,String>{
@Override
protected String doInBackground(Object... strings) {
....
String param = anotherMagicalFunctionThatGivesParamToSend(strings[1]);
for(i = 1; i < websites.length; i++){
new SendTo.execute(websites[i],param);
}
}
}
但是可悲的是,我在AS上遇到這些錯誤:
必須從主線程調用方法execute,當前推斷的線程為worker
非靜態方法'execute(Params ...)'不能從靜態上下文中引用
那么您有什么想法或解決方案或方法來實現這一目標嗎? 感謝您的幫助。
正如有人指出,在一些評論和您所看到的異常,也不能啟動AsyncTask
從任意線程上下文(例如doInBackground()
另一種方法AsyncTask
。而不是開始他們的權利,那么,收集你的String
“參數送”到一個數組或Set
,並返回從doInBackground()
方法。然后,在你onPostExecute()
方法返回值將作為參數來提供。通過陣列或每個條目走Set
並觸發一個新AsyncTask
來處理該交易。
如果希望它們並行運行,請對AsyncTask
使用備用executeOnExecutor
,否則它們將分別串行運行。
您還可以使用自己的ThreadPool
來完成類似的操作,這可以通過創建多個AsyncTask
對象來減少堆顛簸,因為它們只有1次使用。
您的第一個錯誤: Method execute must be called from the main thread, currently inferred thread is worker
,因為您正在從第一個任務的doInBackground()
調用第二個AsyncTask
。 doInBackground()
是輔助線程,您不能從后台線程執行其他任務,它必須來自UI
線程。 AsyncTask
適用於簡短操作,如果您需要更復雜的操作,請考慮使用Thread
。
您的第二個錯誤: Non-static method 'execute(Params...)' cannot be referenced from a static context
是因為您正在調用AsyncTask
,就好像它是靜態的,而不是實例。 您對new SendTo.execute(websites[i], param)
調用似乎可以,但是您不能擁有2個參數, execute()
的參數作為數組傳入
我的建議是,對於看起來相似的請求,不要有2個單獨的任務,而是要有1個任務,並添加一個標志來定義要執行的操作類型。 (發送或doInBackground()
),然后在doInBackground()
檢查該標志並執行指定的操作。 似乎您正在發送數據,然后嘗試檢索響應,因此,在SEND操作完成后,添加一個您現在要檢索該數據的輔助標志,並在onPostExecute()
為其他操作重新運行任務。
我假設您想啟動AsyncTask
在后台並行執行某項操作。
為此,不要使用嵌套的AsyncTask
而應該使用ExecutorService
,將任務提交到這樣的工作程序池,收集結果,從異步任務返回。
一些細節在Android的ExecutorService文檔中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.