2011-05-18 210 views
0

我有執行web請求基本異步任務。該線程不包含在循環或任何內容中,它執行請求並從run()返回。當我嘗試執行另一個請求時,使用該線程,我得到一個拋出的異常,因爲該線程已經在運行。我已搜索周圍有很多在這個網站尋找答案,但都似乎要拿出被停止了在一個循環的線程,基本上迫使線程返回。Android的線程不會停止運行

如果我只是把線程的請求代碼進入一個循環,在某些種類標誌的等待從主線程告訴它繼續前進,再次執行?像:

public void run() 
{ 
    while (threadIsStillRunning) 
    { 
     while (!threadShouldExecute) 
     { 
      //Sleep the thread 
     } 
     //Execute the request 

    } 
} 

編輯: 好吧,但是這裏的線程(這是包含在我班上的一個對象 - WebServiceHelper):

private Thread executeRequest = new Thread() 
{ 
    public void run() 
    { 
     //Meat of the code 
     isRunning = false; 
    } 
} 

我則在同一類的另一個類方法( WebServiceHelper):

private volatile boolean isRunning = false; 
public void Execute(WebServiceHandler handler) 
{ 
    while (isRunning) 
    { 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    isRunning = true; 
    r = handler; 
    executeRequest.start(); 
} 

其中r是隻是我用來執行回調執行請求對象的接口對象。

然後在我的主要活動(即請求的線程執行一個我這樣的:

private Runnable getSiteData = new Runnable(){ 
    public void run(){ 
     mWebServiceHelper.SetMethod("GetSiteData"); 
     mWebServiceHelper.Execute(mySiteHelper); 
    } 
}; 

public void downloadDidFinish(List<Map<String, String>> data) 
{ 
    // TODO Auto-generated method stub 
    TeamList.StoreTeams(data); 

    mHandler.post(getSiteData); 
} 

downloadDidFinish得到由紗線之上完成後調用,那麼我的權利,你可以看到後執行另一個請求。當我嘗試在WebServiceHelper再次呼籲Execute,再次啓動線程的碰撞正在發生的事情。

+2

你將有一個更容易得到與提高與真正的堆棧跟蹤真正的例外,所有這些都在這個問題提供真正的代碼幫助。像「當我嘗試執行另一個請求,使用線程,我得到一個異常拋出,因爲線程已經運行」抽象的東西是很難讓別人來分析,因爲我們沒有讀心術,因此不一定識別特定例外或理解你如何試圖重用該線程。 – CommonsWare 2011-05-18 16:43:41

+0

我們需要更多的上下文才能在這裏爲您提供幫助。某種調試信息會有所幫助。 – 2011-05-18 16:44:53

+0

增加了一些代碼到這個問題 – 2011-05-18 17:03:56

回答