2011-09-03 84 views
0

Im有困難與HttpConnection發佈數據到我的服務器。第一次一切順利。第二次它說; '流已經打開',但是我在響應後關閉了所有內容。j2me openOutputStream流已經打開

這裏是我的代碼:

import javax.microedition.io.Connector; 
import javax.microedition.io.HttpConnection; 
import javax.microedition.location.*; 
import java.io.*; 

class GetSnowheights 
{  
    HttpConnection http = null; 
    QualifiedCoordinates q = null; 
    public String result = "Geen data"; 
    private boolean running; 

    public GetSnowheights(QualifiedCoordinates q) {   
     try 
     { 
      /* 
      this.http = (HttpConnection)Connector.open("http://www.diamond4it.nl/bb/");     
      this.http.setRequestMethod(HttpConnection.POST); 
      this.http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      */ 
      //Internet.getInstance(); 
      this.http = Internet.getConnection(); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
     this.q = q; 
     this.result = "Running"; 
    } 

    public void GetResult(){ 
     StringBuffer sb = new StringBuffer();   
     this.result = "GetResult"; 

     if(this.http != null){ 

      OutputStream os = null; 
      InputStream is = null; 
      try 
      { 
       //Send request 
       os = this.http.openOutputStream(); 
       String data = "lat=1&lng=1"; 
       //String data = "lat=" + this.q.getLatitude() + "&lng=" + this.q.getLongitude(); 
       os.write(data.getBytes()); 
       os.flush(); 
       os.close(); 
       this.result = "dataSend";     

       //Check response and read data 
       int res = this.http.getResponseCode(); 
       this.result = "Result: " + res; 
       if(res == 200){ 
        is = this.http.openInputStream(); 
        int ch; 
        // Check the Content-Length first 
        long len = this.http.getLength(); 
        if(len!=-1) { 
         for(int i = 0;i<len;i++){ 
          if((ch = is.read())!= -1){ 
           sb.append((char)ch); 
          } 
         } 
        } else { 
         // if the content-length is not available 
         while ((ch = is.read()) != -1){ 
          sb.append((char)ch); 
         } 
        } 
        is.close(); 
       } 

       this.result = sb.toString(); 

      }catch(Exception err){ 
       //err.printStackTrace(); 
       this.result = err.toString() + "\r\n" + err.getMessage(); 
      }finally{ 
       if(is != null){ 
        try{ 
         is.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 
       if(os != null){ 
        try{ 
         //os.flush(); 
         os.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 

       /* 
       if(http != null){ 
        try{ 
         http.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 
       */ 
      } 

     }else{ 
      this.result = "No connection"; 
     } 
    }  

} 
+0

你想重複使用'this.http'嗎?也就是說,你是否不需要一個新的'HttpConnection'就多次調用'GetResult()'?我不認爲這是允許的。 –

+0

它是一個Singleton類Internet,它返回一個有效的httpconnection。這個.http是這個類中的一個私有的,所以是的,我重用了它。 –

+0

好的,你可以爲'GetSnowheights'類的每個實例調用'GetResult()'多次?這意味着你正試圖重用'HttpConnection'。我自己從來沒有這樣做過,但它將我視爲一個潛在的問題。如果在每次調用GetResult()之前重構代碼以創建新的GetSnowheights實例呢? –

回答

0

2個想法:

  1. 你爲什麼在finally塊註釋掉http.close()?我們應該總是關閉HttpConnections。

  2. 難道你不能同時從幾個線程調用GetResult()嗎?如果是,則通過在其定義中添加​​關鍵字來使該方法同步。

P.S.我覺得這個班的設計有點誤導。錯誤地使用它是很容易犯的錯誤。我將GetSnowheightsGetResult合併成唯一的同步方法。

+0

不行不行。仍然是同樣的消息。即使與sinchronized void –

+0

然後,我只是不知道要提出什麼。 –