2013-12-13 75 views
-4

首先,11我需要您的注意兩件事情:HttpURLConnection的工作API級別<11,不工作的API級別>在Android

1)我試圖與API級手機驗證碼低於11以及相當高的手機,如4.3或4.4。與其他的手機不同的是,高級的api手機無法使這個代碼工作。 2)我在另一個頁面中使用了幾乎精確的代碼,使用它,它正在處理所有apis,只有我要告訴你的那個不工作。 感謝您的收聽。

這是我的方法,使連接:

public static StringBuilder httpGetConnection (String urlStr, Context dialogCtx) { 
    final String noServ = "Server Error"; 
    final String noServErr = "Server is unavailable"; 
    StringBuilder err= new StringBuilder(); 
    err.append("Error!"); 

    HttpURLConnection conn = null; 
    BufferedReader rd = null; 
    StringBuilder sb = null; 
    try { 
     URL url = new URL(urlStr); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setConnectTimeout(6000); 
     conn.setReadTimeout(10000); 
     if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 299) { 
      // Buffer the result into a string 
      rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      sb = new StringBuilder(); 
      String line; 
      while ((line = rd.readLine()) != null) { 
       sb.append(line); 
      } //string builder dolduruldu 
      rd.close(); 

      conn.disconnect(); 

     } 
     else { 
      AlertDialogDisp(dialogCtx, noServ, noServHata); 
     } 
    } 
    catch (Exception e) { 
     return err; 
    } 
    finally { 
     if (rd != null) { 
      try { 
       rd.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 
    return sb; 
} 

這是我的代碼,「使用」的方法:

try { 
    JSONTokener neuTokener = new JSONTokener(Sources.httpGetConnection (UrlStr, getActivity()).toString()); 
     JSONArray neuArray=new JSONArray(neuTokener); 

     for(int i=0; i<(neuArray.length()); i++) 
     { 
      JSONObject json_obj_neu_sip = neuArray.getJSONObject(i); 

      wartSip = json_obj_neu_sip.getString("mit"); 
      wartSip2 = json_obj_neu_sip.getString("tua"); 
      akkSip = json_obj_neu_sip.getString("ptar"); 
      ajjSip = json_obj_neu_sip.getString("ptar2"); 
     } 
     ... 

我使用這個代碼,它使用方法,在一個片段。當我嘗試啓動它時,neuTokener的值是「錯誤!」。從我的方法,當它落在趕上StringBuilder。但我不知道它爲什麼會捕捉到這個東西,我在不同的地方使用它並且沒有問題。 我真的很感謝幫助,在此先感謝。

+1

你在主線程上調用'httpGetConnection'嗎? – Apoorv

+2

Rly另一個NetworkOnMainThreadException ?? –

+2

@ A.S。是的,就像隔天一樣。這不像是有一個搜索引擎,你可以搜索錯誤,正在拋出。 – Ahmad

回答

1

你需要通過AsyncTask實現所有的背景Network Calls線程。
這是一個虛擬的模板,你可以根據自己的需要修改它:

private class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     //Send your HTTP REQUESTS HERE. 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //UPDATE YOUR UI HERE AFTER RETRIEVING DATA FROM HTTP REQUEST 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 
} 

你需要調用此的AsyncTask,像這樣:new LongOperation().execute();
我希望這有助於。

+1

哇,非常感謝! –

+0

我的快樂:-) –

1

一個非常常見的錯誤 - 嘗試在主UI線程中調用httpGetURLConnection,因爲這是一個非常繁重的操作,並且UI在使用httpGetURLConnection時不能「凍結」,這樣爲什麼在新的android版本(在honeyComb之後)其總體不推薦使用。你應該使用一個asyncTask來處理httpGetURLConnection。

+0

謝謝,這正是我想知道的,而不是我多麼錯誤和愚蠢。 –

1

也許你會得到NetworkOnMainThreadException連接錯誤。

所以最好的方法是使用AsyncTask

欲瞭解更多詳情,請與this