2013-10-20 100 views
0

我在製作HttpPost調用時遇到了在我的Android項目中捕獲到的異常,我找不到原因。這是網絡呼叫的方法的開始:Android HttpPost異常null

try { 


     this.httpClient = new DefaultHttpClient(); 
     httpPost = new HttpPost(url); 

     if (json != null && json != "") { 
      httpPost.setEntity(new ByteArrayEntity(json.getBytes("UTF8"))); 
      httpPost.setHeader("Content-type", "application/json"); 
      if(token!=null) { 
       //httpPost.setHeader("Authorization", "Basic VEU5SFNVNWZWRmxRUlY5RFZWTlVUMDFGVWpwcWFXMXRlV1JoWjJobGNrQm5iV0ZwYkM1amIyMDZNVEV4TVE9PQ=="); 
       httpPost.setHeader("Authorization", "Basic " + token); 
      } 
     } 



     HttpParams httpParameters = new BasicHttpParams(); 
     // Set the timeout in milliseconds until a connection is established. 
     // The default value is zero, that means the timeout is not used. 
     int timeoutConnection = 15000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 15000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
     httpClient.setParams(httpParameters); 


     httpResponse = httpClient.execute(httpPost); 

最後一行是發生異常的位置。我嘗試註銷exception.getMessage(),但它是空的。這裏是堆棧回溯:

java.net.PlainSocketImpl.read(PlainSocketImpl.java:492) 
java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241) 
org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180) 
org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
com.arcmobileapp.web.WebServices.getResponse(WebServices.java:106) 
com.arcmobileapp.web.WebServices.createReview(WebServices.java:601) 
com.arcmobileapp.web.SubmitReviewTask.performTask(SubmitReviewTask.java:59) 
com.arcmobileapp.web.SubmitReviewTask.doInBackground(SubmitReviewTask.java:47) 
com.arcmobileapp.web.SubmitReviewTask.doInBackground(SubmitReviewTask.java:1) 
android.os.AsyncTask$2.call(AsyncTask.java:287) 
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
java.util.concurrent.FutureTask.run(FutureTask.java:137) 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
java.lang.Thread.run(Thread.java:856) 

任何想法可能會導致異常?它不會每次都發生,它似乎是間歇性的(網絡?)。

在此先感謝。

+1

你有沒有INTERNET_PERMISSION? – Blackbelt

回答

1

java.net.PlainSocketImpl當您嘗試連接的端口上沒有監聽服務時,通常會發生此異常。

重新檢查以下三件事情

1)主機名和端口你試圖連接到。

2)服務器端設法正確開始收聽。

3)沒有防火牆阻止連接。

0

試驗驗證碼:

public class HttpConnectionTask 
{ 
    public static final int RESPONSE_OK = 0; 
    public static final int RESPONSE_ERROR = 1;  

    private String body = null; 
    private String strUrl; 
    private int responsCode; 
    private List<NameValuePair> postData = null; 

    public HttpConnectionTask(String strUrl) 
    { 
     this.strUrl = strUrl; 
    } 

    public HttpConnectionTask(String strUrl, List<NameValuePair> postData) 
    { 
     this.strUrl = strUrl; 
     this.postData = postData; 
    } 

    public void run() 
    {    
     try 
     {   
      this.responsCode = RESPONSE_OK; 

      HttpClient client = new DefaultHttpClient(); 
      HttpResponse response = null; 

      if(this.postData == null) 
      { 
       HttpGet get = new HttpGet(this.strUrl);    
       response = client.execute(get); 
      } 
      else 
      { 
       HttpPost postMethod = new HttpPost(this.strUrl); 
       postMethod.setEntity(new UrlEncodedFormEntity(this.postData, "UTF-8")); 
       response = client.execute(postMethod); 
      } 

      // Get the response 
      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      this.body = ""; 

      char[] dataChunk = new char[1024];    
      StringBuffer dataBuffer = new StringBuffer(); 

      int readSize = 0; 

      while((readSize = rd.read(dataChunk)) >= 0) 
      {     
       dataBuffer.append(dataChunk, 0, readSize);     
      } 

      this.body = dataBuffer.toString().trim();      
     }   
     catch (Exception ex) 
     {    
      this.responsCode = RESPONSE_ERROR; 
     }            
    } 

    public String getBody() 
    { 
     return this.body; 
    } 

    public int getResponse() 
    { 
     return this.responsCode; 
    } 
} 

,並使用這個類:

String url = "Your url" + "?exam1=1"; //for get data              

List<NameValuePair> postData = new ArrayList<NameValuePair>();   
postData.add(new BasicNameValuePair("test1", "123")); //for post data 
postData.add(new BasicNameValuePair("test2", "456")); //for post data 

HttpConnectionTask httpPost = new HttpConnectionTask(url, postData); 
httpPost.run();