2011-04-05 79 views
0

我寫了一個返回字符串的函數。並且有一個Thread實現函數,如下所示,並且我調用[metaDataTrimmed = getMetaData(url);]這個函數並將返回值存儲爲一個字符串值。我的問題是該函數立即返回空字符串,這是它的初始值。我檢查了我的功能正常工作。從JavaME線程返回正確的值

所以我嘗試使用dirtybit的Thread.sleep()方法,並嘗試Thread.join()。黑莓手機有什麼標準方法來解決這個問題,如果不是解決問題的好方法?

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; 

} 
+0

你能準確地格式化你的問題嗎?在'private String getMetaData(final String mediaUrl)'的代碼中,我根本沒有看到任何'return'語句... – 2011-04-05 11:33:18

+0

好吧,我編輯問題...返回statemnt在最後... – Jisson 2011-04-05 12:16:55

回答

2

我覺得你是一個Thread越來越null的原因是你沒有等待線程執行結束。這與BlackBerry無關,但純粹與Java有關。要解決這個問題,只需在單獨的(從UI)線程上完成整個任務(而不僅僅是聯網)。完成任務後,您需要更新UI,然後使用UiApplication.getUiApplication().invokeLater(Runnable action)模式。

+0

我在UI – Jisson 2011-04-05 12:18:23

+0

@Jisson中使用上面的代碼不直接:對不起,我沒有明白你的意思。 – 2011-04-05 12:55:55

+0

我正在開發一個在線廣播應用程序,當我的應用程序加載它顯示列表字段中的一些文本時,用戶單擊這些列表元素一些新的列表元素生成到同一個列表字段,經過一些迭代後,我們通過解析得到一些流urls json通過服務器返回,當我得到一個流url時,我嘗試使用一個使用Player對象的類來播放它。我嘗試從這個類中提取元數據。 – Jisson 2011-04-05 14:48:05