2011-12-02 38 views
0

我使用黑莓中的線程來執行Web服務調用。我希望在通話得到迴應後立即收到通知。我用使用黑莓中的線程

處理程序

在android系統

。我沒有發現任何類似的黑莓手機。

這裏是我使用運行線程的代碼

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

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

我怎樣才能得到通知後,線程運行結束? 我該如何在黑莓手機上做到這一點? 謝謝

添加更多信息:感謝您的回覆。它真的是 資料。讓我再解釋一下我的問題。我有一個 webservice調用正在一個線程上運行。只要我從服務器得到 答覆,我想執行下一個函數(下一個呼叫 到服務器),這是基於前一次調用的響應。所以我需要等到我收到響應。在他們同時我也需要在屏幕上顯示活動指示器 。我在Android中使用處理程序爲 。我正在尋找類似黑莓的 。

回答

3

所以你的問題基本上是這樣的

  1. 一個線程沒有工作,而其他線程等待完成
  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. 
    } 
} 
+0

感謝您的回覆。我編輯了這個問題來添加更多信息。你能看看嗎?謝謝 – Zach

3

當我得到了扎克的問題 - 他問如何執行一些代碼,涉及用戶界面的變化(像顯示的信息彈出或關閉進度彈出)後臺線程完成時。在Android上,在UI線程上創建的Handler通常用於此目的。

在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)(等等)的確如此。

請注意,您可以隨時通過靜態調用Application.getApplication()獲取Application實例的句柄。

所以在後臺結束線程可以安全地做這樣的事情:

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); 
    } 
}); 
+0

感謝您的回覆。我在我的問題中添加了更多信息。你能看看嗎?謝謝 – Zach

+0

@Zach:我認爲上面的信息清楚地表明,爲了「在屏幕上顯示一個活動指示器」,你可以使用'Application.invokeLater(Runnable runnable)'。這是因爲傳遞的runnable將在UI線程上執行。這與'Handler.post(Runnable r)'在Android中的作用類似。 –

1

Android有一個更豐富的多線程原語。但即使在黑莓平等優雅,你也可以達到同樣的效果。我在下面提供的解決方案基本上與以前相同,只是稍作改動。使用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(); 
    } 
} 

注意,我只提供存根給你一個想法,你會如何完成。讓我們知道怎麼回事。