Вернуть правильное значение из потока JavaME

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

Поэтому я пытаюсь использовать метод Thread.sleep(), используя грязный бит, а также пытаюсь использовать 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;

}

person Jisson    schedule 05.04.2011    source источник
comment
Не могли бы вы точно сформулировать свой вопрос? В коде private String getMetaData(final String mediaUrl) я вообще не вижу оператора return...   -  person Vit Khudenko    schedule 05.04.2011
comment
ок, редактирую вопрос... Последнее заявление о возврате...   -  person Jisson    schedule 05.04.2011


Ответы (1)


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

person Vit Khudenko    schedule 05.04.2011
comment
Я разрабатываю приложение для онлайн-радио. Когда мое приложение загружает его, показывает некоторые тексты в поле списка, пользователь щелкает в этих элементах списка, некоторые новые элементы списка генерируются в тот же список, после некоторых итераций мы получаем некоторые URL-адреса потока путем анализа json возвращается сервером. Когда я получаю URL-адрес потока, я пытаюсь воспроизвести его, используя класс, используя объект Player. И я пытаюсь извлечь метаданные из этого класса. - person Jisson; 05.04.2011
comment
Я считаю, что мы получаем некоторые URL-адреса потока, анализируя возврат json сервером. Когда я получаю URL-адрес потока, я пытаюсь воспроизвести его, используя класс, используя объект Player. И я пытаюсь извлечь метаданные из этого класса. должна быть одна задача, которая выполняется в отдельном потоке. Тогда в потоке все будет происходить последовательно, и поэтому вы не получите неожиданных нулей. - person Vit Khudenko; 05.04.2011