2011-08-17 64 views
5

Tôi có một ứng dụng đang làm một số lượng không nhỏ của tải hình ảnh thu nhỏ và các nguồn lực khác từ một dịch vụ từ xa.HttpClient quầy hàng trong thời gian dài, ngay cả với các thông số thời gian chờ thiết lập

Tôi đang sử dụng một phiên bản duy nhất của DefaultHttpClient và một lớp tùy chỉnh mà tôi đã viết để lên lịch cho tất cả các lần tải xuống của mình. Tất cả tải xuống được chạy theo chuỗi trên nền chủ đề thông qua AsyncTask. Tôi không chạy lại thường trình tải xuống của mình cho đến khi onPostExecute được thực hiện trong AsyncTask.

Điều này thường hoạt động hoàn hảo. Nếu tôi xếp hàng lên 20 hình ảnh, trình lập lịch biểu của tôi thực hiện điều tốt. Tuy nhiên, tôi chạy vào các trường hợp mà thủ tục chỉ cần quầy hàng tại điểm gọi client.execute (nơi máy khách là cá thể của tôi về DefaultHttpClient). Tôi không thể giải thích được quá trình bằng cách điều hướng xung quanh ứng dụng và thực hiện các hành động ngẫu nhiên (di chuyển danh sách, điều hướng qua lại giữa các hoạt động, v.v.). Nó giống như một cái gì đó tôi đang làm là gửi một "thức dậy" tin nhắn đến một sợi đã bị đình trệ hoặc bế tắc.

Tôi đã thêm số lượng đăng nhập đáng ghét vào tất cả các phần di chuyển của ứng dụng để xem có điều gì đó bên ngoài quy trình này đang gây ra tình trạng bế tắc nào đó không. Tôi xem LogCat bởi pid để xem liệu có bất cứ điều gì khác đang xảy ra trong quá trình của tôi tại thời điểm trì hoãn hoặc tại thời điểm tiếp tục, và tôi không thấy bất cứ điều gì bất thường. Phần kỳ lạ nhất về điều này là tôi có thể lặp lại tình trạng chính xác hơn và hơn.

FWIW, tôi đã đặt thời gian chờ của ổ cắm và thời gian chờ kết nối trên cả cá thể HttpClient và cá thể HttpGet mà tôi chuyển sang phương thức thực thi. Điều này không gây ra phương thức thực thi để trả về sớm hoặc ném một ngoại lệ hay bất cứ thứ gì như thế. Khi thủ tục "khởi động lại", HttpClient.execute trả về một HttpResponse hợp lệ và mọi thứ hoạt động như bình thường.

Bất kỳ ý tưởng nào về những điều tôi có thể gỡ lỗi để tìm ra nơi này đang bị vấp ngã? Tôi nhận ra rằng đây là một điều kiện rất cụ thể, nhưng có phương pháp nâng cao nào để gỡ lỗi cụ thể lưu lượng truy cập DefaultHttpClient hoặc http trong Android nói chung không?

Cảm ơn!

Trả lời

5

Bạn có chia sẻ cùng một HttpClient qua các chủ đề không? Mặc định, nó không phải là an toàn theo luồng, vì vậy bạn có thể muốn kiểm tra điều đó. Nhiều khả năng nó chặn trên I/O mặc dù, vì vậy bạn nên làm một số gỡ lỗi dây. Bạn có thể sử dụng một cái gì đó như thế này để kích hoạt các bản ghi kết xuất dây của HttpClient:

Logger.getLogger("org.apache.http.wire").setLevel(Level.FINEST); 
Logger.getLogger("org.apache.http.headers").setLevel(FINEST); 
Logger.getLogger("httpclient.wire.header").setLevel(FINEST); 
Logger.getLogger("httpclient.wire.content").setLevel(FINEST); 

System.setProperty("org.apache.commons.logging.Log", 
    "org.apache.commons.logging.impl.SimpleLog"); 
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); 
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "debug"); 

Để bật nó, hãy thực hiện các lệnh trình bao sau. Các bản ghi dây sẽ được xuất ra logcat:

adb shell setprop log.tag.org.apache.http VERBOSE 
adb shell setprop log.tag.org.apache.http.wire VERBOSE 
adb shell setprop log.tag.org.apache.http.headers VERBOSE 
+0

Cảm ơn bạn đã trả lời ... khó khăn để nhận câu trả lời cho các câu hỏi cụ thể và dài dòng đó. Tôi sẽ thử đăng nhập, nhưng tôi tin rằng bạn đã chỉ cho tôi đúng hướng. Tôi đang sử dụng AsyncTask mang lại cho tôi chủ đề từ một hồ bơi thread ... điều này có thể gây ra một số vấn đề. Tôi sẽ thử một lớp Thread có nguồn gốc duy nhất để không bao giờ có nhiều hơn một cuộc gọi đồng thời tới HttpClient.execute trên các chủ đề khác.Tôi muốn sẵn sàng để đặt cược rằng mặc dù thực hiện trả về trước khi tôi chạy vòng lặp của tôi một lần nữa, có lẽ một số dọn dẹp mà không hoàn thành chạy trước khi các chủ đề tiếp theo đến in – Rich

+0

Btw, tôi đã thêm mã này và tôi không thấy bất kỳ nhật ký bổ sung nào trong LogCat. Còn gì nữa không? Là nó bán phá giá các bản ghi vào một tập tin, hoặc tôi nên nhìn thấy điều này trong LogCat? – Rich

+0

Nên đăng nhập. Đảm bảo bạn thực thi điều này trước mã của ứng dụng, như trong trình khởi chạy tĩnh. –

-2

Tôi đã có một vấn đề tương tự trước đây. Khi tôi cố gắng thực hiện HTTP trong hàng đợi, phương thức httpClient.execute(get); sẽ không trả về một phản hồi, như bế tắc.

HttpResponse response = httpClient.execute(get); 
HttpEntity entity = response.getEntity(); 

Đây là mã của tôi và điều tôi làm là gọi entity.consumeContent(); khi đó nó hoạt động.

+0

Không thực sự trả lời câu hỏi. –

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