2012-03-16 36 views
5

Xin chào, tôi đã hỏi câu hỏi này, nhưng lần này tôi kiểm tra phương pháp đó để cho phép tất cả chứng chỉ không gây ra sự cố.Android - Định kỳ thời gian chờ HttpClient xảy ra

Tôi phát triển một ứng dụng cũng có trên iPhone. Vấn đề là với yêu cầu api. Tôi thiết lập thời gian chờ cho tất cả các yêu cầu. Đôi khi nó xảy ra một loại phá vỡ từ 30-60 giây. Có vẻ như ứng dụng này yêu cầu cặp vợ chồng và hơn là phá vỡ, tất cả thời gian chờ, sau khoảng 45 giây mọi thứ ok.

Tôi không biết đây có phải là sự cố máy chủ hay Android hay không.

Vấn đề này không xảy ra trên iPhone với IOS 5, nhưng cũng apear trên IOS 4.

tôi kiểm tra cho HttpClient và cũng để chơi bóng HttpsURLConnection.

Kết nối là https, cũng đang thử địa chỉ IP trực tiếp.

Mọi yêu cầu đều có cùng một sự cố, mọi yêu cầu đều có trong các tác vụ không đồng bộ.

Tất cả họ trông giống nhau:

DefaultHttpClient client = new HttpSupport().getNewHttpClient(); 

    client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT),new UsernamePasswordCredentials(user, pass)); 

    HttpGet httget = new HttpGet("xxxxxxxxxxxxxxxxxxxxxxx"); 
    httget.setHeader("Accept", "application/json"); 

    HttpResponse respond = null; 

    try 
    { 
     respond = client.execute(httget); 
    } 
    catch (ClientProtocolException e) 
    { 
     Log.e(TAG,"getEvents, ClientProtocolException"); 
    } 
    catch (IOException e) 
    {   
     Log.e(TAG,"getEvents, IOException: " + e.getMessage()); 
    } 

Mã dor lớp HttpSupport của tôi là trong câu hỏi trước của tôi: Android - API Requests

Đó là có thể là lỗi máy chủ? Cảm ơn bạn đã giúp đỡ.

Gần đây tôi nhận thấy rằng ứng dụng được treo trên client.execute ... hãy thử thực hiện như sau: android httpclient hangs on second request to the server (connection timed out), nhưng sẽ không giúp ích gì. Có lẽ không phải là lỗi api, nhưng Android là như vậy. Ứng dụng này đang chỉ api thực sự thường xuyên, nhưng đối với hầu hết yêu cầu tất cả mọi thứ là ổn.

Vẫn không thể thoát khỏi 30-45 giây bị treo cứng.

Hôm nay tôi đã kiểm tra lại ứng dụng và tôi nhận thấy rằng lỗi chỉ xảy ra trên kết nối wi-fi trên Samsung Tablet với 3.2. Trên Wildfire với 2.3.7 (wi-fi và 3g) mọi thứ dường như không sao. Tôi không nói rằng vấn đề đó không xảy ra trên thiết bị di động, nhưng trong khi tôi đang thử nghiệm, tôi đã không nhận thấy thời gian chờ.

Trả lời

3

Khách hàng của bạn có tập hợp thời gian chờ quá ngắn - trên kết nối di động bạn nên đợi tối đa 30 giây để tạo kết nối và vượt quá 30 giây để nhận phản hồi.

Mã của bạn (thông qua liên kết của bạn):

int timeoutConnection = 3000; 
     HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 5000; 
     HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

Đó là trong mili giây. Vì vậy, thời gian chờ kết nối của bạn là 3 giây và phản hồi là 5 giây.

Tôi sẽ thực hiện tương ứng 30000 và 60000.

Ngoài ra, nếu bạn muốn loại trừ bất kỳ sự cố máy chủ nào, hãy cài đặt proxy HTTP như fiddler2 và sử dụng nó để hiển thị từng yêu cầu HTTP/HTTPS và bạn sẽ thấy mỗi phản hồi của máy chủ. Sau đó, bạn sẽ thấy nếu máy khách hoặc máy chủ đang hoạt động không đúng.

+0

Bạn có chắc chắn về thời gian không? Tôi đã có vấn đề này ngay cả khi tôi sử dụng các thiết bị trên wi-fi và những kẻ từ api gửi cho tôi một phản ứng 'lần, mỗi dưới 0,5 giây. – goodm

+0

Không phải 100% vấn đề của bạn, nhưng chắc chắn chúng quá ngắn đối với tất cả các trường hợp kết nối mà bạn có thể gặp phải. Nhưng, đó là lý do tại sao tôi khuyên bạn nên chạy với Fiddler - nó sẽ giúp pin-điểm vấn đề của bạn. – peterept

+0

Thật không may ngay cả khi tôi thay đổi thời gian chờ, nó sẽ không khắc phục được sự cố của tôi, nó chỉ kéo dài thời gian chờ đợi. – goodm

2

Tôi không có giải thích rõ ràng cho vấn đề của bạn nhưng tôi có một cái nhìn vào mã của bạn và nghĩ rằng có một số lỗi thiết kế trong mã của bạn. để lại chúng và để chúng bị rò rỉ trong thời gian chạy.

Trong HttpSupport.getNewHttpClient() thực hiện của bạn:

public DefaultHttpClient getNewHttpClient() { 
    try { 
    ... ... 

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

    return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
    return new DefaultHttpClient(); 
} 

}

Bạn trả về một HttpClient dụ trong cả hai cố gắng và khối catch, nơi một từ khối try trả về một mạnh mẽ HttpClient rằng nhận thức đúng giao thức, thông tin đăng nhập, v.v. được sử dụng để truy cập máy chủ HTTP từ xa. Điểm trở lại của một HttpClent khỏa thân khác trong khối catch khi ngoại lệ xảy ra là gì. Ngoại lệ thường có nghĩa là một số lỗi dự kiến ​​xảy ra và được nhà phát triển chăm sóc tại thời điểm biên dịch, những gì bạn đã làm chỉ đơn giản là bỏ qua tất cả cảnh báo hữu ích và để chúng bị rò rỉ khi chạy ứng dụng và thậm chí tệ hơn. thời gian. Vì vậy, lần đầu tiên cố gắng để xác định bạn vấn đề là thay đổi bạn mã để xử lý ngoại lệ đúng cách, chỉ cần in ra dấu vết ngăn xếp ngoại lệ và tìm thấy những vấn đề tiềm năng khi tạo/khởi tạo HttpClient của bạn là gì. Một điểm khác tôi muốn đề cập đến là bạn đang tạo/khởi tạo HttpClient theo yêu cầu, tức là tạo và khởi tạo phiên bản mới của HttpClient mỗi lần bạn cần gửi yêu cầu HTTP, có thể không liên quan đến vấn đề của bạn nhưng không hiệu quả IMO.

Cảm giác của tôi là vấn đề của bạn có thể liên quan đến việc tạo/khởi tạo HttpClient trong môi trường đa luồng (như bạn đã nói bạn sử dụng AsyncTask), vì HttpClient không an toàn. hi vọng điêu nay co ich.

+0

Tôi đã suy nghĩ về điều này, nhưng khi tôi đặt Log.e ("HttpClient", e.toString()); trong trường hợp ngoại lệ bắt nó không bao giờ xảy ra trong Nhật ký của tôi. Vì vậy, đây không phải là nguyên nhân của việc này. Tôi bắt đầu giả định rằng đây là lỗi máy chủ chứ không phải ứng dụng. – goodm

+0

Tuy nhiên, trả lại HttpClient khỏa thân trong khối catch là vô nghĩa tuyệt đối. Ứng dụng của bạn nâng cao yêu cầu HTTP như thế nào? có bất kỳ vị trí nào trong ứng dụng của bạn tạo và tăng nhiều yêu cầu HTTP cùng một lúc (thông qua AsyncTask) không? – yorkw

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