2013-03-08 981 views
9

Sự cố: Tôi muốn tải trước một trang web bên trong Android WebView và đính kèm nó vào Hoạt động khi Hoạt động đã sẵn sàng. Điểm kích hoạt tải trang web là trước khi Hoạt động thực tế được tạo. Vì vậy, tôi tạo một đối tượng webview trong một dịch vụ theo cách sau.Sự khác nhau khi tôi tạo đối tượng Android WebView với ContextWrapper và Context là gì?

MutableContextWrapper contextWrapper = new MutableContextWrapper(serviceContext.getApplicationContext()); 
this.webView = new WebView(contextWrapper); 

Khi hoạt động cần hiển thị chế độ xem web này được tạo, tôi chỉ tạo một chế độ xem trên mạng và thêm chế độ xem trang web này và bộ gọi làContentView. Bằng cách này, chế độ xem web của tôi hiển thị được tải trước với trang web. Tôi cũng làm như sau

contextWrapper.setBaseContext(CurrentActivity.this); 

Đây là cùng một đối tượng ContextWrapper như được chỉ định ở trên. Ngay cả sau này, webview không vẽ JavaScript Alerts mà nó có thể vẽ trong trường hợp sử dụng bình thường.

Ngay cả Khi tôi làm

ContextWrapper contextWrapper = new ContextWrapper(CurrentActivity.this); 
this.webView = new WebView(contextWrapper); 
this.webView.loadUrl(someUrl); 

Các WebView không có khả năng bật lên JS cảnh báo. Tôi thậm chí không thấy bất kỳ thẻ Ngoại lệ hoặc Tử vong nào trong nhật ký. WebView không thể vẽ bất kỳ cửa sổ nào trên đầu trang của nó.

Điều này hoạt động tốt theo cách thông thường có nghĩa là tạo webView trực tiếp với ngữ cảnh của hoạt động hiện tại.

this.webView = new WebView(CurrentActivity.this); 
this.webView.loadUrl(someUrl); 

Đối với tất cả, tôi biết http://developer.android.com/reference/android/content/ContextWrapper.html chỉ thực hiện các thao tác tương tự trên bối cảnh cơ bản mà nó giữ cho nó trong hàm tạo.

Trường hợp sử dụng của tôi giống như thế này. Tôi tạo một đối tượng webView với một số http://developer.android.com/reference/android/content/MutableContextWrapper.html được truyền cho nó. MutableContextWrapper giữ bối cảnh của một số hoạt động hoặc nó có thể giữ hoặc bối cảnh ứng dụng. Khi hoạt động thực tế cần hiển thị chế độ xem web được bắt đầu, tôi chuyển ngữ cảnh bên trong MutableContextWrapper và hiển thị webview bằng cách đặt nó trong bố cục khung và setContentView. Về cơ bản, kích hoạt để bắt đầu tải trang trước khi Hoạt động được tạo và do đó tôi muốn tải trước trang trong chế độ xem web và chỉ đính kèm trang vào hoạt động khi nó được tạo.

+0

Tôi không thể hiểu rõ câu hỏi. Miễn là nó được upvoted nhiều người có thể cố gắng làm cho nó rõ ràng hơn? –

+0

Xin chào Boris, tôi đã cập nhật chi tiết câu hỏi –

Trả lời

1

Dường như bạn đang tạo xem web off the thread UI chính (dựa trên việc sử dụng các serviceContext)

này thường không phải là một ý tưởng tốt như xem web sẽ mong đợi Handler nội bộ của nó sẽ được ràng buộc vào chuỗi giao diện người dùng chính.

Có đề khác liên quan đến điều này:

A WebView in a thread can't be created

Bạn đang tốt hơn off tải webview sau khi hoạt động được nạp (ví dụ trong phương pháp onCreate) và chỉ hiển thị một "tải" chỉ số cho người dùng. Bạn có thể ẩn webview (với setVisibility) cho đến khi nó tải trang và sử dụng WebViewClient để nghe sự kiện tải.

Khi trang đã tải đặt chế độ hiển thị trên chế độ xem web của bạn thành VISIBLE