2011-08-07 44 views
16

Tôi gặp một số sự cố với trình mô phỏng Android 3.1 của mình. Tôi không thể lấy tập tin XML của mình.Trường hợp ngoại lệ kết nối Android http

protected InputStream getInputStream() { 
    try { 

     return feedUrl.openConnection().getInputStream(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

Đây là lỗi dấu vết:

08-07 22:34:26.657: ERROR/AndroidRuntime(563): Caused by: android.os.NetworkOnMainThreadException 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.lookupHostByName(InetAddress.java:477) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at java.net.InetAddress.getAllByName(InetAddress.java:249) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:523) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at maps.test.BaseFeedParser.getInputStream(BaseFeedParser.java:30) 
08-07 22:34:26.657: ERROR/AndroidRuntime(563):  at maps.test.DomFeedParser.parse(DomFeedParser.java:23) 

Tôi nghĩ tôi không thể kết nối với Internet, ngay cả với <uses-permission android:name="android.permission.INTERNET"/>. Nhưng đồng thời, API Google đang hoạt động rất tốt.

+0

thể trùng lặp của [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android -os-networkonmainthreadexception) – laalto

Trả lời

52

Nguyên nhân: android.os.NetworkOnMainThreadException

Trong Honeycomb họ đã đi và đặt vào một cái bẫy để bắt người cố gắng làm có khả năng hoạt động mạng tốn nhiều thời gian trên sợi chính.

Từ: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

Trường hợp ngoại lệ được ném ra khi một ứng dụng cố gắng để thực hiện một hoạt động mạng về chủ đề chính của nó.

Điều này chỉ được ném cho các ứng dụng nhắm mục tiêu SDK Honeycomb trở lên. Các ứng dụng nhắm mục tiêu các phiên bản SDK trước đó được phép thực hiện kết nối mạng trên các chuỗi sự kiện chính của chúng, nhưng nó không được khuyến khích nhiều. Xem tài liệu Designing for Responsiveness.

Đồng thời xem StrictMode.

(Xin lưu ý rằng bạn có thể có ngay lập tức tìm thấy này mình bằng cách thực hiện một tìm kiếm web trên ngoại trừ ở phía trên cùng của các thông báo lỗi bạn được đăng.)

Bởi vì những thứ như nhìn lên một tên máy chủ có thể mất một khoảng thời gian dài và không xác định thời gian, chúng không nên được gọi từ các hàm sự kiện trên luồng chính được yêu cầu để trả về nhanh chóng (như trong vòng vài phần nghìn giây). Nếu một trong các chức năng này mất quá nhiều thời gian để quay trở lại, Android sẽ mất khả năng gửi tin nhắn đến chương trình và có thể bật lên hộp thoại Ứng dụng không phản hồi đáng sợ.

Bạn nên di chuyển các hoạt động mạng của mình (ít nhất là bất kỳ yêu cầu nào chờ kết quả hoặc bị tắc nghẽn để bạn có thể gửi thêm) cho một chuỗi. Nếu các hoạt động mạng đến từ một đoạn mã API, có thể bạn không nên gọi nó trên luồng chính.

+0

tôi nhận được lỗi tương tự nhưng tôi có công việc http của tôi trong một chủ đề riêng biệt tức là công việc không đồng bộ. Điều gì có thể đã đi sai? bạn có thể hướng dẫn tôi về điều này không? –

+0

Bạn có thể không sử dụng tác vụ không đồng bộ chính xác và không đặt tất cả các hoạt động mạng trong phương thức nền, hoặc được gọi là phương thức nền từ chuỗi ui thay vì bắt đầu tác vụ không đồng bộ. Khi bạn kiểm tra dấu vết ngăn xếp của bạn, bạn sẽ tìm ra cái nào. –

+0

tôi đã kiểm tra kỹ lưỡng, cuộc gọi http được gọi trong phương thức doInBackground() được gọi từ lệnh .execute(), vẫn là luồng trả về: org.apache.harmony.luni.internal.net.www.protocol.http. FixedLengthInputStream @ 405259f0 –

4

Bạn có

<uses-permission android:name="android.permission.INTERNET" /> 

trong Android Manifest của bạn? Nên trên thẻ application bạn

+0

Tôi allready thêm nó, Đừng quên rằng tôi đã nói google API làm việc rất tốt. – oueslatibilel

+0

nhưng bạn cho rằng Google API có thể hoạt động mà không cần kết nối? vì MyLocationOverlay không hoạt động! nhưng tôi có thể acces vào bản đồ và thêm Overlay tĩnh oueslatibilel

+0

Hãy thử di chuyển thẻ sử dụng-phép trên các ứng dụng , vì vậy nó là Pikaling

3

Ngoại lệ này chỉ được ném cho các ứng dụng nhắm mục tiêu SDK Honeycomb trở lên. bạn có thể nhắm mục tiêu sdk của bạn bằng hoặc cao hơn api cấp 11. Chỉ cần thay đổi nó để api cấp 8 hoặc cấp api khác dưới đây 11. vấn đề của bạn có thể được giải quyết

Here là cùng một vấn đề, nó đã được giải quyết bằng cách thay đổi mức api.

Tôi hy vọng nó sẽ giúp bạn. !!

+1

nhắm mục tiêu api dưới 11 không hoạt động. – logray

+1

Trên thực tế theo cách tôi hiểu nó, ngoại lệ này được ném vào mục đích để ngăn chặn các hoạt động mạng tốn thời gian trên luồng chính. Vì vậy, vấn đề không phải là API anh ta nhắm mục tiêu nhưng cách anh ta xử lý các hoạt động mạng;) – AgentKnopf

0

Xóa android: targetSdkVersion "version_number" khỏi AndroidManifest của bạn.xml

Tôi đã gỡ bỏ nó và vấn đề của tôi được giải quyết

15

Sử dụng Async Task hoặc

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

Đây là một gợi ý tuyệt vời cho tất cả các loại đánh giá nhanh chóng. Bạn không phải mất thời gian với chi tiết chuỗi/async. Cám ơn! –

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