2011-12-20 56 views
2

關於線程的問題並不缺乏,但我知道,但我似乎無法找到一個線程做「http」工作的「完整」示例,然後回來更新UI。如何在Web服務調用線程完成後更新UI

我基本上在應用程序啓動時調用一些Web服務。我顯然不想凍結用戶界面,所以我想要使用一個單獨的線程,對不對?我在網上找到了大量關於如何獲得新線程來執行某些任務的示例。但是我還沒有找到一個展示如何在線程任務完成時實際更新UI的方法。

如何知道Web服務線程何時完成?有沒有回調方法?如果存在,我可以使用此回調方法訪問UI嗎?

編輯:(下面是一些代碼)

//The activate method is called whenever my application gains focus. 

public void activate(){ 

    DoSomething wsThread = new DoSomething(); 
    wsThread.start(); 
} 

public void wsCallBack() 
{ 
    myTabScreen.add(new ButtonField("Callback called")); 
} 

public class DoSomething extends Thread 
{ 
    public void run() 
    { 
     try 
     { 
      wsCallBack(); 
     } 
     catch(Exception e) 
     { 

     }   
    } 
} 

很簡單。但它從不創建按鈕。

任何想法?

非常感謝。

回答

3

您可以設置一個「回調」系統來在線程完成時通知UI。有一個擴展Thread的類並傳遞給最後應該調用的類的引用。如果您有需要通知的類的列表,請在線程實現上創建一個Vector來保存它們。重寫run函數並完成你需要做的所有事情之後,只需在UI類上調用一個方法(如果需要,就遍歷該向量)。所以,你的類可能看起來像:

public class commThread extends Thread{ 

    MyUIClass callbackObj; 

    public commThread(MyUIClass myUiClass){ 
     callbackObj = myUiClass; 
    } 

    public void run(){ 
     //do stuff 
     callbackObj.callback(); 
    } 

} 

和您的UI類:

public MyUIClass{ 

    public void callback(){ 
    //refresh the UI 
    } 
} 

當然,如果你有多個線程同時運行,並調用相同的用戶界面對象一定要回調同步方法。

希望這會有所幫助!

+0

非常感謝回覆。然而,我似乎無法從我的主線程的activate()方法啓動新線程,這正是我最終要做的。這是不允許的? – PaulG 2011-12-22 16:52:39

+0

你可以發佈一些代碼和你嘗試這樣做時得到的錯誤嗎?你的主線程的激活方法是什麼意思? – Tamar 2011-12-22 18:11:29

+0

我上面編輯了我的問題以顯示一些代碼。謝謝 – PaulG 2011-12-28 13:52:42

相關問題