2015-04-16 53 views
0

這裏有一個問題: 在Android的代碼,如果我宣佈異步任務:Android的線程實例化

重要編輯:所有這些任務被通過並行執行處決。我不是連續執行它們,在這種情況下,這些答案中的一部分會很明顯。

AsynchronousTask task1 = new AsynchronousTask(); 
task1.execute(); 

我上層建築實例化任務的另一項任務在完成前:

task1 = new AsynchronousTask(); 

是否舊任務完成其工作,或是否由垃圾收集得到回升?


如果我創建了正在等待TASK1的光潔度聽​​衆:

FinishListener finishListener = new FinishListener() 
{ 
    //do stuff 
} 
AsynchronousTask task1 = new AsynchronousTask(finishListener); 
task1.execute(); 

,我以這種方式覆蓋TASK1和執行:

task1 = new AsynchronousTask(finishListener); 
task1.execute() 

將聽者觸發舊task1或新task1的完成?


如果我重新實現了監聽器,這種改變嗎?

FinishListener finishListener = new FinishListener() 
{ 
    //do stuff 
} 
AsynchronousTask task1 = new AsynchronousTask(finishListener); 
task1.execute(); 
finishListener = new FinishListener() 
{ 
    //do different stuff 
} 
task1 = new AsynchronousTask(finishListener); 
task1.execute(); 

回答

1

如果你調用execute,你是在串行執行它們,因爲這就是Android如何執行AsyncTasks。要並行執行它們,你必須調用executeOnExecutor(AsycTask.THREAD_POOL_EXECUTOR,params);

但要回答你的問題,如果你確實有並行執行:

1)覆蓋一個變量不殺死線程。它會繼續在後臺運行

2)兩者都有。兩個線程都通過了同一個監聽器。首先會發生的是比賽條件

3)在這種情況下,舊線程完成時將調用舊偵聽器,並且新線程完成時將調用新偵聽器。首先發生的是競賽狀況。

+0

同意所有3點,但是OP確實提到使用執行程序並行運行任務 - 即使他沒有顯示如何正確配置(如果?)。 –

+0

它的確如此,我所說的技術上只適用於1.6和3.0+。對於2.x,他們確實並行運行。假設他正在瞄準更新的設備,我過度簡化了。 –