2013-01-08 64 views
0

我有兩個不同的類2個AsyncTasks但問題是當第一是在不執行所述第二backgroung狀態做。第一個asyncTask如果在循環中執行,因爲它需要每5秒更新一次新數據。如果我停止任務(condition = flase),那麼第二個完美的工作。執行兩個的AsyncTask在兩個不同的類

第一類:

public class MapScreen extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_screen); 

     UpdateUserCords updateUC = new UpdateUserCords(); 
     updateUC.execute(); 
    } 

class UpdateUserCords extends AsyncTask<String, Void, String> 
{ 


    @Override 
    protected String doInBackground(String... params) { 


     while(condition) 
     { 

      //some code in loop... 


      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return null; 

    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 


     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 


     super.onPostExecute(result); 
    } 
} 

} 

二等:

public class Groups extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_groups); 


    getGroups getGr = new getGroups(); 
    getGr.execute(); //not executing, no error or crash 


} 


class getGroups extends AsyncTask<String, Void, String> 
{ 


    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

    @Override 
    protected String doInBackground(String... params) { 
     //some code... 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 

     super.onPostExecute(result); 
    } 


} 
} 

回答

3

的Android API 11後,AsyncTask開始吧,以在默認情況下連續執行運行,這意味着只有一個任務正在運行。爲了讓之前的以API 11的行爲,這是對ThreadPoolExecutor運行,你需要在代碼中指定它是這樣的:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) { 
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 
else { 
    myTask.execute(); 
} 

請看看這裏瞭解更多信息: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

祝你好運!

P.S.它不推薦使用AsyncTask爲無限線程,AsyncTask目的是做任務的背景,而不是永久運行,所以如果你想無限線程,我想你應該創建爲Thread而不是作爲AsyncTask

+0

謝謝,但我認爲串行執行程序比ThreadPoolExecutor更好,如果它在更新的API版本中。它可能會導致代碼問題或執行速度緩慢? – Dim

+0

這不是一些執行者比另一個更好,他們有不同的角色。串行執行程序意味着只有一個任務將在同一時間運行(這是默認設置,因爲我記得,他們選擇它作爲默認值,因爲很多人沒有與多線程相處)。 ThreadPool執行器意味着許多任務可以在同一時間運行,並且這是您希望實現的行爲,所以這是您需要用來實現它的執行器,非常簡單。 – Elad92

+0

它的工作原理,謝謝Elad! – Dim

0

你asynctasks是在兩個不同的活動。 隨時只有一項活動處於活動狀態。

+0

我知道我的asynctasks是在兩個不同的活動,但是當我開始第二次活動,我可以看到第一個的AsyncTask仍在工作。這不是答案,它只是查看問題的另一種方式。 – Dim

+0

那麼你應該在你的activity的onPause方法上調用asynctask cancel(boolean)方法,如果你想在離開活動時停止asynctask。你也可以執行上的onResume方法的AsyncTask,因此當用戶來自另一項活動回來,的AsyncTask運行 –

-1

兩個類延伸活性與其中只有一個是在同時運行。 如果你想有一個任務不是活動的壽命來執行時間越長,你必須把它包裝成一個Service

+0

Actualy我不希望我的AsyncTask運行時間比我的活動,但是當我打開第二個活動首先是沒有完成。我不希望完成它,因爲我不希望用戶可以通過按回退按鈕 – Dim

+0

返回到第一個活動。一旦用戶導航到另一個活動,如果您的活動被破壞或不在您的控制之下,它就不再受您的控制。查看http://developer.android.com/training/basics/activity-lifecycle/index.html如果你不停止你的Asycn Task,它可能會導致線程泄漏。那爲什麼要爲此付出代價呢? –

+0

這是錯誤的,首先,如果一個活動正在運行,這並不意味着另一個活動已經完成,一個活動可以運行,另一個將被暫停。但即使他在Activity A中啓動了AsyncTask,然後啓動了Activity B,並且正如您所說的那樣,Activity A被殺死了,AsyncTask仍然繼續運行,所以這不是他所描述的問題。 – Elad92

相關問題