2013-05-08 24 views
20

Ở đây tôi đang sử dụng Json tải mã này. Đó là một công việc tốt với Android 2.2 nhưng khi tôi đang sử dụng android 4.2 nó ném android.os.NetworkOnMainThreadException ngoại lệ xin vui lòng cho tôi giải phápandroid.os.NetworkOnMainThreadException với android 4.2

public class JSONParser { 

    static InputStream is = null; 

static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url) { 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

      HttpResponse getResponse = httpClient.execute(httpPost); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), 
        "Error " + statusCode + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 

     //HttpResponse httpResponse = httpClient.execute(httpPost); 
     //HttpEntity httpEntity = httpResponse.getEntity(); 
     is = getResponseEntity.getContent();    

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d("IO", e.getMessage().toString()); 
     e.printStackTrace(); 

    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 

}

tôi cũng đang sử dụng google api.

+0

Câu hỏi có đã được trả lời ở đây: http://stackoverflow.com/questions/5150637/networkonmainthreade xception –

+0

http://stackoverflow.com/a/12615724/1168654 –

Trả lời

73

Viết mã bên dưới vào tệp MainActivity của bạn sau khi setContentView (R.layout.activity_main);

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

Và câu lệnh nhập dưới đây vào tệp java của bạn.

import android.os.StrictMode; 
+38

nó không phải là cách chính xác để tắt StrictMode. Cách chính xác là gọi các hoạt động mạng trong AsyncTask thay vì tắt –

+0

Vì @SankarV cho biết nó nên được thực hiện bằng cách sử dụng AsyncTask thay vì tắt chế độ nghiêm ngặt. –

+0

Điều này không được khuyến nghị. AsyncTask là một cách tốt hơn để làm điều này. –

6

Hãy chắc chắn rằng bạn không làm bất kỳ truy cập mạng trên UI Chủ đề, thay vì làm điều đó trong Async Task

Lý do tại sao tai nạn ứng dụng của bạn trên các phiên bản Android 3.0 trở lên, nhưng hoạt động tốt trên Android 2.x là bởi vì kể từ khi HoneyComb là chặt chẽ hơn về lạm dụng chống lại các chủ đề giao diện người dùng. Ví dụ, khi một thiết bị Android chạy HoneyComb hoặc cao hơn phát hiện một truy cập mạng trên thread UI, một NetworkOnMainThreadException sẽ được ném ra.

Xem this

+0

thay vì HoneyComb và Ice Cream Sandwich Tôi sẽ nói Từ HoneyComb. Trong thực tế, JB có cùng một chính sách – Blackbelt

1

android.os.NetworkOnMainThreadException xảy ra khi bạn cố gắng truy cập mạng trên thread chính của bạn (Bạn chính hoạt động thực hiện). Để tránh điều này, bạn phải tạo một chuỗi riêng biệt hoặc thực hiện AsyncTask hoặc Runnable để thực thi tải dữ liệu JSON của mình. Vì HoneyComb bạn không thể thực hiện thêm nhiệm vụ mạng trên luồng chính. Here là việc triển khai sử dụng AsyncTask để thực hiện tác vụ mạng

1

Sử dụng StrictMode Something như thế này: -

if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 
     } 
+2

nó không phải là cách chính xác để tắt StrictMode. Cách chính xác là gọi các hoạt động mạng trong AsyncTask thay vì tắt. họ có cung cấp séc chỉ để tắt không? –

+0

chúng tôi có thể sử dụng asynkTask cũng nhưng đối với tôi nó làm việc –

+0

ya nó sẽ làm việc nhưng không phải là cách tốt nhất. họ đã cung cấp kiểm tra để đảm bảo nhà phát triển gọi các hoạt động mạng trong chuỗi riêng biệt không chỉ đơn giản là tắt. –

13

Đây là cách chính xác:

public class JSONParser extends AsyncTask <String, Void, String>{ 

    static InputStream is = null; 

static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 
@Override 
protected String doInBackground(String... params) { 


    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

      HttpResponse getResponse = httpClient.execute(httpPost); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), 
        "Error " + statusCode + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 

     //HttpResponse httpResponse = httpClient.execute(httpPost); 
     //HttpEntity httpEntity = httpResponse.getEntity(); 
     is = getResponseEntity.getContent();    

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d("IO", e.getMessage().toString()); 
     e.printStackTrace(); 

    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 


} 
protected void onPostExecute(String page) 
{ 
    //onPostExecute 
} 
} 

Để gọi nó (từ chính):

mJSONParser = new JSONParser(); 
mJSONParser.execute(); 
+0

thậm chí bạn đã kiểm tra điều đó chưa? Không hoạt động url đó là gì? trả về obj không thể truy cập bên ngoài vòng lặp –

Các vấn đề liên quan