2011-12-20 13 views
2

スレッドについての質問は不足していませんが、http作業を行っているスレッドの「完全な」例を見つけることができないようですUIを更新します。Webサービスがスレッドを終了した後にUIを更新する方法

私は基本的に、アプリの起動時にいくつかのWebサービスを呼び出します。私は明らかにUIをフリーズしたくないので、別のスレッドを使用したいと思います。私はいくつかのタスクを実行する新しいスレッドを取得する方法のオンラインの例を見つけました。しかし、スレッドのタスクが完了したときに実際にUIを更新する方法を示すものはまだ見つかりませんでした。

ウェブサービススレッドがいつ完了したかはわかりますか?コールバックメソッドはありますか?このコールバックメソッドが存在する場合は、そのメソッドから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に通知するために、「コールバック」システムを設定できます。スレッドを拡張し、最後に呼び出されるクラスのリファレンスを渡すクラスを作成します。通知が必要なクラスのリストがある場合は、それらを保持するために、スレッド実装上にVectorを作成します。実行関数をオーバーライドし、必要な処理をすべて実行した後、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 
    } 
} 

を使用すると、複数のスレッドが同時に実行されていると同じUIオブジェクトを呼び出した場合は、コールバックを同期するようにしてください方法。

希望すると便利です。

+0

お返事ありがとうございます。しかし、私は最終的に何をしようとしている私のメインスレッドのactivate()メソッドから新しいスレッドを開始するように見えることはできません。これは許されないのですか? – PaulG

+0

あなたはこれをしようとするといくつかのコードとエラーを投稿することはできますか?メインスレッドのactivateメソッドはどういう意味ですか? – Tamar

+0

上記の質問を編集してコードを表示しました。ありがとう – PaulG

関連する問題