android编程使用webview控件时遇到的问题
自己用webview写了一个小程序,就是提供一个webview界面,打开固定的网址,提供前进、后退功能,发现如果打开的是网上的实际网址,一切正常但是一旦打开的是保存在本地...
自己用webview写了一个小程序,就是提供一个webview界面,打开固定的网址,提供前进、后退功能,发现如果打开的是网上的实际网址,一切正常
但是一旦打开的是保存在本地的网页,就会出异常,异常log如下:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
源代码如下:
package com.MyBrowser.android;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
public class MyBrowserActivity extends Activity {
/** Called when the activity is first created. */
WebView wv;
Handler handler;
Button btnexit;
Button btnback;
Button btnforward;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
wv = (WebView)findViewById(R.id.webView1);
wv.getSettings().setJavaScriptEnabled(true);
wv.setScrollBarStyle(0);
wv.loadUrl("file:///sdcard/web/baidu.htm");《----------------这还是正确的,能够成功打开本地保存的baidu首页
btnexit = (Button)findViewById(R.id.exit);
btnback = (Button)findViewById(R.id.back);
btnforward = (Button)findViewById(R.id.forward);
wv.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
Log.d("MyBrowserActivity","url: "+ url);
loadurl(view,url); 《---------这个地方会报错
return true;
}
});
btnback.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
wv.goBack();
}
});
btnforward.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
wv.goForward();
}
});
btnexit.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
finish();
}
});
}
public void loadurl(final WebView view,final String url){
new Thread(){
public void run(){
view.loadUrl(url);
}
}.start();
}
} 展开
但是一旦打开的是保存在本地的网页,就会出异常,异常log如下:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
源代码如下:
package com.MyBrowser.android;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
public class MyBrowserActivity extends Activity {
/** Called when the activity is first created. */
WebView wv;
Handler handler;
Button btnexit;
Button btnback;
Button btnforward;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
wv = (WebView)findViewById(R.id.webView1);
wv.getSettings().setJavaScriptEnabled(true);
wv.setScrollBarStyle(0);
wv.loadUrl("file:///sdcard/web/baidu.htm");《----------------这还是正确的,能够成功打开本地保存的baidu首页
btnexit = (Button)findViewById(R.id.exit);
btnback = (Button)findViewById(R.id.back);
btnforward = (Button)findViewById(R.id.forward);
wv.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
Log.d("MyBrowserActivity","url: "+ url);
loadurl(view,url); 《---------这个地方会报错
return true;
}
});
btnback.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
wv.goBack();
}
});
btnforward.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
wv.goForward();
}
});
btnexit.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v) {
finish();
}
});
}
public void loadurl(final WebView view,final String url){
new Thread(){
public void run(){
view.loadUrl(url);
}
}.start();
}
} 展开
5个回答
展开全部
Only the original thread that created a view hierarchy can touch its views.
这句话的意思是只有创建这个view的线程才可以操控它
你在loadurl方法里使用新的线程来操作webview,这个就会报错
loadurl方法里不用线程就行了应该
这句话的意思是只有创建这个view的线程才可以操控它
你在loadurl方法里使用新的线程来操作webview,这个就会报错
loadurl方法里不用线程就行了应该
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是不是没有给上网的权限啊?在Androidmanifest.xml文件中添加
<uses-permission android:name="android.permission.INTERNET" /> </manifest>
或者是设置一下读取网页的方式,先读缓存,缓存没有就联网
web.getSettings().setCacheMode(WebSettings. LOAD_CACHE_ELSE_NETWORK);
<uses-permission android:name="android.permission.INTERNET" /> </manifest>
或者是设置一下读取网页的方式,先读缓存,缓存没有就联网
web.getSettings().setCacheMode(WebSettings. LOAD_CACHE_ELSE_NETWORK);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
所有有关于Activity显示的操作只能在UI线程里
wv.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
Log.d("MyBrowserActivity","url: "+ url);
loadurl(view,url); 《---------这个地方会报错
看最上面的那句~你在里面建立了一个匿名内部类了~
wv.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
Log.d("MyBrowserActivity","url: "+ url);
loadurl(view,url); 《---------这个地方会报错
看最上面的那句~你在里面建立了一个匿名内部类了~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
百度一下呗。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把你报错的地方的WebViewClient匿名内部类实现,改成一个单独的子类。
然后set。再试试。
明白我的意思不?
然后set。再试试。
明白我的意思不?
追问
比较白,还有些不明白。
要是这个问题,为什么打开的如果不是本地路径就没有问题,比如我打开的是http://www.baidu.com。如果打开后在点击里面的其他链接都能正常打开,不会报错。
另外你说的怎么改不太明白,能帮我改好吗?
追答
那把你的布局文件main.xml发一下吧。我好给你改~
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询