sca*_*moi 12 android android-webview
在一个子类中WebView,我曾经在一个重写方法中使用此行getTitle():
String title = super.getTitle();
Run Code Online (Sandbox Code Playgroud)
它在Android的所有版本中运行良好,直到我在Android 4.1手机上测试我的应用程序,这给了我这条警告super.getTitle():
12-20 21:38:27.467:W/webview_proxy(2537):java.lang.Throwable中:警告:网页视图方法被称为上螺纹'WebViewCoreThread'. 必须在UI线程上调用所有WebView方法.WebView的未来版本可能不支持在其他线程上使用.
所以,我正在考虑通过runOnUiThread()以下方式解决这个新法令:
Activity a = this.getActivity();
a.runOnUiThread(new Runnable() {
public void run() {
String title = super.getTitle();
}
});
Run Code Online (Sandbox Code Playgroud)
但是这段代码甚至不会编译因为super不再引用WebView,而是指代Activity.
任何想法如何super.getTitle()从UI线程?(使用上面描述的约束,在getTitle()子类中WebView)
摩根的答案虽然可以修复编译错误,但实际上并不能解决这个问题.
首先,它不会改变对getTitle()不同线程的调用.这个潜在的问题是Android在运行时为您提供错误的原因.
你在评论中说
情况是我在WebViewClient.onPageFinished()中调用它,它恰好不在UI线程上.
这可能是个问题.如果您从UI线程启动Web请求,那么onPageFinished()肯定会在UI线程上回调.你能解释一下你是如何开始网络请求的吗?为什么你这样做呢?绝大多数时候,你不应该onPageFinished()在后台看到调用,所以你可能在其他地方遇到问题.
(注意:如果您认为需要WebView.loadUrl()在后台调用以避免阻止UI,请在该问题上查看此其他答案)
如果您确实认为需要在后台启动Web请求,并且onPageFinished()在后台看到调用,则需要注意调用getTitle()UI线程.
此外,如果您从onPageFinished()方法中调用它,则无需使用如下语法:
String title = MyWebView.this.getTitle();
Run Code Online (Sandbox Code Playgroud)
在该方法中,您将传递Web视图的实例,因此只需直接使用它:
public void onPageFinished (WebView view, String url) {
String title = view.getTitle();
}
Run Code Online (Sandbox Code Playgroud)
但是,正如我所说,这并不能解决线程问题.您需要向我们展示了为什么您要使用的页面标题,该方法中,但一个方式安全地使用它会是这样的:
public void onPageFinished (final WebView view, String url) {
view.post(new Runnable() {
public void run() {
String title = view.getTitle();
// do something with title that affects the UI here
}
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,我需要在上面的代码中创建view参数final.
我没有直接回答你的问题,但我可以建议时,我遇到了类似的问题,为我工作一个解决办法:查找调用调用该方法的方法String title = super.getTitle();,并运行它通过runOnUiThread() .
HTH.
| 归档时间: |
|
| 查看次数: |
5575 次 |
| 最近记录: |