Вернуть правильное значение из потока JavaME - PullRequest
0 голосов
/ 05 апреля 2011

Я написал функцию, которая возвращает строку. И есть реализация потока, функция, как следует, и я вызываю [metaDataTrimmed = getMetaData (url);] эту функцию и сохраняем возвращаемое значение в строковое значение. Моя проблема в том, что функция немедленно возвращает пустую строку, которая является ее начальным значением. И я проверил, что моя функция работает правильно.

Поэтому я пытаюсь использовать метод Thread.sleep () с использованием dirtybit, а также пытаюсь использовать Thread.join (). Есть ли в BlackBerry какой-либо стандартный метод решения проблемы, если нет, то каков хороший подход к решению проблемы?

private String getMetaData(final String mediaUrl){  
         String  metaDataT = "";

        Thread metaThread = new Thread(new Runnable(){        
            public void run(){      
            try {
                StreamConnection streamConnection=null;
                HttpConnection httpConnection = null;
                InputStream inputStream =null;
                streamConnection=(StreamConnection)Connector.open(mediaUrl);
                httpConnection=(HttpConnection)streamConnection;        
                httpConnection.setRequestProperty("Icy-metadata", "1");                   
                int httpStatus=httpConnection.getResponseCode();
                if(httpStatus==HttpConnection.HTTP_OK){

                      String mint = httpConnection.getHeaderField("icy-metaint");
                      inputStream = streamConnection.openInputStream();     
                      int length= Integer.parseInt(mint);
                      int b = 0;    
                      int count =0;    
                      while(count++ < length){
                        b = inputStream.read();         
                      }          
                      int metalength = ((int)b)*16;
                     // if(metalength <= 0){waitBitMetaData = 1;return;}
                      byte buf[] = new byte[metalength];               
                      inputStream.read(buf,0,buf.length);              
                      String metaData = new String(buf);         
                      int streamTilleIndex =   metaData.indexOf("StreamTitle");
                     // if(streamTilleIndex <= 0){waitBitMetaData = 1;return;}
                      String streamTille = metaData.substring(streamTilleIndex);
                      int eqindex = streamTille.indexOf('=');
                   //   if(eqindex <= 0){waitBitMetaData = 1;return;}
                      int colindex = streamTille.indexOf(';');
                   //   if(colindex <= 0){waitBitMetaData = 1;return;}
                      String metaDatam =  streamTille.substring(eqindex, colindex);
                      int lengthOfMaetaDataM = metaDatam.length();
                      if(lengthOfMaetaDataM <= 0){waitBitMetaData = 1;return;}
                      metaDataParsed =metaDatam.substring(2, lengthOfMaetaDataM-2);
                      System.out.println(metaDataParsed);                         
                      waitBitMetaData = 1;
                }

            }
            catch (Exception e){
                System.out.println(e);
                waitBitMetaData = 1;

            }

            }
             });
             metaThread.start();
 metaThread.start();
        //while( metaDataParsed.equals("") || waitBitMetaData == 0){
            //try {
            //  Thread.sleep(50);
            //} catch (InterruptedException e) {
                //System.out.println(e);
            //}
        //}
        return metaDataParsed;

}

1 Ответ

2 голосов
/ 05 апреля 2011

Я думаю, что причина, по которой вы получаете null с Thread, заключается в том, что вы не ждете окончания выполнения потока. Это не связано с BlackBerry, но чисто связано с Java. Чтобы решить эту проблему, просто выполните всю задачу (а не только ее сетевую часть) в отдельном (из пользовательского интерфейса) потоке. Когда по завершении задачи вам нужно будет обновить пользовательский интерфейс, просто используйте шаблон UiApplication.getUiApplication().invokeLater(Runnable action).

...