2013-01-14 18 views
8

Tôi đang sử dụng UIWebView trong ứng dụng của mình. Nó thường hoạt động tốt, nhưng có một tình huống trong đó các ứng dụng nhận được một cảnh báo bộ nhớ và cuối cùng bị treo.Ứng dụng nhận cảnh báo bộ nhớ và sự cố khi tải tệp HTML với nhiều video trên YouTube trong UIWebView

tôi tải các nội dung với điều này:

[self.webView loadHTMLString:htmlString baseURL:baseURL]; 

Có một trường hợp trong đó htmlString có trong hơn 25 video YouTube (đây không phải là ý tưởng của tôi - đó là trang web Tôi nhận được). Vì vậy, trong trường hợp này, ứng dụng nhận được một số cảnh báo bộ nhớ và cuối cùng bị treo.

Tôi có thể quản lý tình huống này bằng cách nào? Có thể tải tệp HTML theo các bước khác nhau không?

Tôi không biết việc này có liên quan gì không, nhưng tôi đang đặt kích thước UIWebView - và kích thước nội dung của chế độ xem cuộn bao quanh chế độ xem web - động. Đây là mã:

- (void) webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // Adaptamos las vistas al contenido y ocultamos el indicador de actividad 

    // Ponemos el webView del tamaño justo del contenido 

    CGRect frame = webView.frame; 
    // Hace falta cambiar la height porque si no, no coge los cambios. Visualmente no se ve diferencia 
    frame.size.height = 1; 
    webView.frame = frame; 
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; 
    frame.size.height = fittingSize.height; 
    webView.frame = frame; 

    // Movemos el botón y lo ponemos donde acabe el webView 
    CGRect buttonFrame = self.visitSiteButton.frame; 
    buttonFrame.origin.y = frame.origin.y + frame.size.height + 20; 
    self.visitSiteButton.frame = buttonFrame; 

    // Ampliamos el contenSize del scrollview general para que quepa todo el webView 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.visitSiteButton.frame.origin.y + self.visitSiteButton.frame.size.height + 10); 
} 

Thanks a lot,

Carlos

Trả lời

0

Dường như 25 video youtube trong một trang HTML đơn là quá nhiều: bộ nhớ đầy và ứng dụng được giết.

Tôi nghi ngờ có nhiều việc phải làm nếu bạn không sẵn sàng sửa đổi thiết kế trang HTML của mình. Nhưng nếu bạn sẵn sàng, thì có rất nhiều lựa chọn. Ví dụ: bạn có thể triển khai tải chậm của HTML (qua javascript) để chỉ một số ít video được hiển thị (như trong UITableView). Hoặc bạn có thể thay thế mã HTML liên kết với youtube bằng một số mã "nhẹ" khác và sau đó cho phép người dùng tải một UIWebView mới để xem một video cụ thể. Vv

+0

Vâng, tôi biết. Nhưng đó là tập tin tôi nhận được ... Và nó không dễ dàng để sửa đổi bởi vì tôi không có quyền kiểm soát về nội dung HTML tôi nhận được.Đó là nội dung của nguồn cấp dữ liệu rss. – Carlos

+0

nếu có cấu trúc, bạn có thể phân tích cú pháp và xử lý theo cách bạn cần. Hãy tưởng tượng một trình đọc rss hiển thị 5 mục tại một thời điểm ... đó là khả thi để chắc chắn .. – sergio

+0

Vấn đề là tôi nhận dữ liệu từ các nguồn khác nhau (nguồn cấp dữ liệu rss khác nhau) và mọi nguồn có cấu trúc khác nhau. Ngay cả những tin tức khác nhau từ mỗi nguồn cấp dữ liệu có thể khác nhau (một tệp html hoàn toàn khác) – Carlos

2

Tình huống khó khăn. Nếu bạn tin rằng mã của bạn không phải là nguyên nhân (sử dụng các công cụ để kiểm tra rò rỉ); sau đó đặt cược tốt nhất tiếp theo của bạn có thể là để thử và tránh tai nạn. Một vài khả năng tôi suy nghĩ:

1) Khi bạn nhận được cảnh báo bộ nhớ, bạn có thể có khả năng:

if (self.webView.loading) { 
    [self.webview stopLoading]; 
    //inform user page cannot be fully loaded. 
} 

2) Nếu điều đó không làm việc, bạn có thể có thể return NO trong UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType: sau một cảnh báo bộ nhớ để ngăn chặn trang tiếp tục kéo các tài nguyên nặng.

3) Có lẽ là phương sách cuối cùng, hãy ngừng tải chế độ xem web, xóa nó khỏi chế độ xem của bạn và phát hành nó.

Hy vọng một trong số đó sẽ hoạt động. Bạn có thể chia sẻ trang đang gặp sự cố không? Âm thanh hữu ích cho mục đích thử nghiệm! Ngoài ra - bạn nên nộp một rdar với Apple trong trường hợp họ muốn giải quyết điều này ở mức thấp hơn.

+0

Cảm ơn Dave! Tôi se thử lơi gợi y của bạn. Thật không may, html tôi đã cố gắng để tải đến từ một nguồn cấp dữ liệu rss và bây giờ, nó đã biến mất khỏi nguồn cấp dữ liệu ... Nếu tôi tìm thấy vấn đề một lần nữa tôi sẽ cố gắng khuyến nghị của bạn! – Carlos

3

Làm thế nào về một mẹo nhỏ nghịch ngợm. Nhận html của trang có mã như sau:

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 
    NSURLResponse * response = nil; 
    NSError * error = nil; 
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString* newStr = [[NSString alloc] initWithData:theData 
            encoding:NSUTF8StringEncoding]; 

Sử dụng regex để tìm phần tử video và thay thế bằng thẻ siêu liên kết hình ảnh tùy chỉnh của bạn>. Hiển thị chuỗi html là:

[webView loadHTMLString: baseURL:nil]; 
Các vấn đề liên quan