0

ブラックベリーのスレッドを使用して Web サービス呼び出しを実行しています。通話の応答が返ってきたらすぐに通知を受け取りたい。使っていました

ハンドラー

アンドロイドで。ブラックベリーに似たものは見つかりませんでした。

スレッドを実行するために使用しているコードは次のとおりです

class PrimeRun implements Runnable {
         long minPrime;
         PrimeRun(long minPrime) {
             this.minPrime = minPrime;
         }

         public void run() {
             // compute primes larger than minPrime
              . . .
         }
     }

スレッドの実行が終了した後に通知を受け取るにはどうすればよいですか? ブラックベリーでこれを行うにはどうすればよいですか? ありがとう

追加情報: ご返信ありがとうございます。本当に有益です。私の問題についてもう少し説明させてください。スレッドで実行されている Web サービス呼び出しがあります。サーバーから返信が返ってきたらすぐに、前の呼び出しからの応答に基づいて次の関数 (サーバーへの次の呼び出し) を実行したいので、応答が返ってくるまで待つ必要があります。また、同時に画面にアクティビティインジケーターを表示する必要があります。私はアンドロイドでこれにハンドラを使用していました。ブラックベリーで似たようなものを探しています。

4

3 に答える 3

3

だからあなたの質問は本質的にこれです

  1. 一方のスレッドがジョブを実行し、他方のスレッドが完了を待つ
  2. 最初のスレッドがジョブを完了し、2 番目のスレッドに「通知」します。

これは単純な生産者と消費者の問題です。これを解決するコードは次のとおりです。

 class JobResult
{
  boolean done = false;
}

JobResult result = new JobResult();

 class Worker extends Thread
{
    JobResult _result;
    public Worker( JobResult result )
    {
        _result = result
    }
    public void run()
    {
        // Do some very long job
        synchronized( _result )
        {
            // modify result
            _result.done = true;
            _result.notify();
        }
    }
}

public class Waiter extends Thread
{
    JobResult _result;
    public Waiter( JobResult result )
    {
        _result = result;
    }
    public void run()
    {
        synchroinzed( _result ){

            while(! _result.done)
            {

                this.wait();
            }
        }
        // Wait is over. You can do something now.
    }
}
于 2011-12-02T19:11:38.840 に答える
3

Zach の質問を受け取ったとき、バックグラウンド スレッドの完了時に UI の変更 (情報ポップアップを表示する、進行状況ポップアップを閉じるなど) を含むコードを実行する方法を尋ねました。AndroidHandlerでは、UI スレッドで作成された がその目的でよく使用されます。

BB では、デスクトップ Java の Swing に似た別の方法を使用できます。UI スレッドでコードを実行する必要がある場合は、コードを でラップしてRunnable、次のいずれかのメソッドに渡します。

// Puts runnable object into this application's event queue, 
// and waits until it is processed.
Application.invokeAndWait(Runnable runnable)

// Puts runnable object into this application's event queue.    
Application.invokeLater(Runnable runnable)

// Puts runnable object into this application's event queue 
// for repeated execution.
Application.invokeLater(Runnable runnable, long time, boolean repeat)

したがって、上記の呼び出しの動作はHandler.post(Runnable r)(など) の動作と似ています。

Applicationstatic call によってインスタンスへのハンドルをいつでも取得できることに注意してくださいApplication.getApplication()

したがって、バックグラウンド スレッドの最後で、次のようなことを行っても安全です。

Application.getApplication().invokeLater(new Runnable() {
    public void run() {
        progressScreen.close();
        Dialog.alert("I am finished!");
    }
});

これは、Android のものに似ています。

handler.post(new Runnable() {
    public void run() {
        progressScreen.dismiss();
        showDialog(DIALOG_TASK_FINISHED_ID);
    }
});
于 2011-12-02T21:40:32.810 に答える
1

Android には、非常に豊富なマルチスレッド プリミティブがあります。しかし、Blackberry でも同等の優雅さで同じことを実現できます。以下に提供するソリューションは、基本的に以前と同じですが、わずかな変更があります。ウェイター スレッドは、UiApplicaiton の invokeLater メソッドを使用して UI スレッドで描画を実行する組み込みユーティリティに置き換えることができます。実際に誰かに「通知」する必要はありませんが、特定のタスクが完了したら UI を更新するだけです。詳細については、ドキュメントを確認してください。

とにかく、次の行に沿ってコードをモデル化できます。

class ProgressScreen extends FullScreen
{
    LabelField _label;
    public void start()
    {
    }
    public void setMessage( final String message )
    {
    UiApplication.getApplication( 
            UiApplication.invokeLater( 
                new Runnable() {
                 _label.setText( message );
            }
        )
    );
    }

    public void dismiss()
    {
        this.close();
    }
}

interface WebserviceTask
{
    int STATUS_CONDITIONS_NOT_SATISFIED = -3;
    int STATUS_NET_ERR = -2;
    int STATUS_FAILURE = -1;
    int STATUS_SUCCESS =  0;

    public int invoke();

}

public class Updater extends Thread
{
    final int NUM_TASKS = 10;
    WebServiceTask tasks[] = new WebServiceTask[ NUM_TASKS ];
    WebServiceTask tasks[0] = new WebServiceTask(){
        public int invoke()
        {
            int retCode = 0;
            // invoke a particular web service
            return STATUS_SUCCESS;
        }
    }

    public void run()
    {
        ProgressScreen progress = new ProgressScreen();
        progress.start();
        for( int i=0; i < NUM_TASKS; i++ )
        {
            int retcode;
            WebServiceTask t = tasks[i];
            retcode = t.invoke();
            String mesg;
            switch( retcode )
            {
            case STATUS_SUCCESS: { mesg ="Task successfully completed!";} break;
            case STATUS_NET_ERR: { mesg ="Could not connect to network";} break;
            }
            progress.setMessage(message);
        }
        progress.dismiss();
    }
}

どのように達成できるかを示すために、スタブのみを提供したことに注意してください。それがどうなるか教えてください。

于 2011-12-04T00:56:15.150 に答える