从JavaME线程返回正确的值

时间:2011-04-05 09:03:58

标签: blackberry java-me blackberry-jde

我写了一个返回字符串的函数。并且有一个Thread实现函数,如下所示,我调用[metaDataTrimmed = getMetaData(url);]这个函数并将返回值存储到字符串值。我的问题是该函数立即返回空字符串,这是它的初始值。我检查了我的功能是否正常工作。

所以我尝试使用dirtybit的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;

}

1 个答案:

答案 0 :(得分:2)

我认为你获得null Thread的原因是你不等待线程执行结束。这与BlackBerry无关,但与Java完全相关。要解决这个问题,只需在一个单独的(来自UI)线程上完成整个任务(不仅仅是网络的一部分)。完成任务后,您需要更新UI,然后使用UiApplication.getUiApplication().invokeLater(Runnable action)模式。