2013-12-13 5 views
-4

Прежде всего у меня есть две вещи, которые необходимо ваше внимание:HttpURLConnection работает на уровне ИЗА <11, не работает на уровне ИЗА> 11 на андроид

1) Я попробовал этот код на телефонах с уровнем апи ниже 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 another NetworkOnMainThreadException ?? –

+2

@ A.S. Да, как каждый день. Это не похоже на поисковую систему, где вы можете искать ошибку, которая бросается. – Ahmad

ответ

1

Вы должны реализовать все Network Calls в фоновом режиме через тему AsyncTask.
Вот фиктивный шаблон, вы можете изменить его в соответствии с вашими потребностями:

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

Очень распространенная ошибка - это попытка вызова httpGetURLConnection в основном потоке пользовательского интерфейса, потому что это очень тяжелая операция, и пользовательский интерфейс не должен «застывать», пока вы работаете с httpGetURLConnection, поэтому почему в новом Android-приложении версии (после honeyComb), ее полностью не рекомендуется. Вы должны использовать asyncTask для работы с httpGetURLConnection.

+0

спасибо, что это было именно то, о чем я хотел знать, а не как неправильно и глупо. –

1

Возможно, вы получаете NetworkOnMainThreadException ошибки соединения.

Лучше всего использовать AsyncTask для этого.

Для более подробной информации перейдите с this

Смежные вопросы