2011-12-02 10 views
0

웹 서비스 호출을 수행하기 위해 블랙 베리에 스레드를 사용하고 있습니다. 전화가 응답을 받으면 즉시 통보를 받고 싶습니다. 나는블랙 베리의 스레드로 작업하기

핸들러 안드로이드에서

을 사용했다. 나는 블랙 베리와 비슷한 것을 찾지 못했다. 여기

내가 스레드를 실행하는 데 사용하고있는 코드입니다

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

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

스레드가 실행을 완료 한 후 내가 알림을받을 수 있습니까? 블랙 베리에서 어떻게 할 수 있습니까? 감사합니다.

추가 정보 : 답장을 보내 주셔서 감사합니다. 정말 그 정보가 입니다. 내 문제에 대해 좀 더 설명하겠습니다. 스레드에서 실행중인 webservice 호출이 있습니다. 서버에서 답장을받는 즉시 이전 호출의 응답을 기반으로 다음 함수 (다음 호출 )를 실행하려고합니다. 응답을받을 때까지 기다려야합니다. 또한 동시에 화면에 활동 표시기를 표시해야합니다. 나는 이 안드로이드에 대한 처리기를 사용했다. 나는 비슷한 것을 찾고있다 블랙 베리. 다른 스레드가 완료

  • 첫 번째 스레드가 작업하고 "통지"두 번째 스레드를 완료 기다리는 동안

  • 답변

    3

    그래서 귀하의 질문은 기본적으로이

    1. 하나의 스레드가 작업 않습니다이다.

    이것은 단순한 생산자 소비자 문제입니다. 이것을 해결할 수있는 코드는 다음과 같습니다. 나는 자크의 질문이 있어요으로

    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

    는 - 그는 백그라운드 스레드 완료시 (AN 정보 팝업을 표시 또는 진행 팝업을 닫는 같은 것을) UI 변경을 포함 몇 가지 코드를 실행하는 방법을 묻습니다. Android의 경우 UI 스레드에서 생성 된 Handler이 자주 사용됩니다.

    BB에서는 데스크톱 자바에서 스윙과 유사한 다른 방법을 사용할 수 있습니다. 당신은 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 인스턴스에 대한 핸들은 항상 정적 호출 Application.getApplication()으로받을 수 있습니다.

    그래서 배경의 말에이 같은 일을하는 것이 안전 스레드 :

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

    그것은 안드로이드의 유사합니다

    handler.post(new Runnable() { 
        public void run() { 
         progressScreen.dismiss(); 
         showDialog(DIALOG_TASK_FINISHED_ID); 
        } 
    }); 
    
    +0

    답장을 보내 주셔서 감사합니다. 내 질문에 더 많은 정보를 추가했습니다. 좀 봐 주시겠습니까? 감사합니다 – Zach

    +0

    @ Zach : 위의 정보가 "화면에 활동 표시기를 표시하려면"Application.invokeLater (Runnable runnable)을 사용할 수 있음을 분명히 나타냅니다. 이는 전달 된 실행 파일이 UI 스레드에서 실행되기 때문입니다. 이것은 Android에서 Handler.post (Runnable r)가하는 것과 유사합니다. –

    1

    안드로이드는 훨씬 더 풍부한 멀티 스레딩의 기본 요소가 있습니다. 그러나 당신은 동일한 우아함을 가진 블랙 베리에서도 똑같이 달성 할 수 있습니다. 아래에 제시된 해결책은 본질적으로 이전과 동일하지만 사소한 변화가 있습니다. 웨이터 스레드는 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(); 
        } 
    } 
    

    주 당신이 달성 할 수 있는지 아이디어를 제공 할 수 있습니다. 어떻게 진행되는지 알려주세요.