簡體   English   中英

在Asynctask中運行多個線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM