activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题

A:

1、好好说说这个问题,底部导航栏用的是tabhost,没有用fragment,因为一开始做的时候没要求用底部导航栏,所以其他的activity都做好了(例如地图、天气等),如果用fragment的话是没办法嵌套activity的,一定会出错的,所以只能用activitygroup来管理子activity,

2、第一个子activity中要嵌套webview,根据之前的文章,android4.2以后实现js和activity交互,必须在activity内部新建内部类来实现其方法。所以就在JsOperation类中的jumpMap()方法中实现由grouptab1控制该activity跳转到mapactivity,代码如下:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第1张图片

3、运行程序时报错,报错如图:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第2张图片

4、上网搜问题原因,是该方法必须在主线程中调用,把该方法拿到内部类的外面去,成为主类内部的方法,但是也不好使。

5、我就确定一下这段代码放在正常的方法中是否好使,我就在webview的布局上面添加了个按钮,根据按钮的监听事件来确定这段代码是否好使,一试果然好使,看来就是内部类的问题。

6、当时就觉得这段代码可能没办法在内部类中实现,是残缺的代码(当时的想法好幼稚,看来是知识储备决定其世界观啊)。就只能继续找寻其他的activitygroup控制activity跳转的代码了

B:

1、找到个音乐播放器的代码,它可以实现左右滑动的效果,将webview嵌套其中,利用js交互,点击地图按钮响应时,出现如下错误:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第3张图片

2、此时的错误代码是:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第4张图片

3、上网搜错误原因,是由于“如果将更新UI控件的代码写入到工作线程中便会报错”。错误如下:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
4、因为这样会阻塞住线程。

5、解决办法网上很多,就是利用thread和handle的post方法来更新控件,解决办法的例子如下:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第5张图片

6、按照这个办法修改代码,播放器的这个demo成功了

C:

1、我就反思了,能不能把这段代码应用到第一个出错的demo中,而且要是用播放器这个demo的话,因为它有很多效果,所以维护起来比较困难

2、把这个解决办法用到了第一个demo中,也好使。解决代码如下:

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第6张图片

activitygroup的子activity中嵌套webview,利用webview与js交互,在实现js点击的内部类代码中实现activity跳转出现的线程问题_第7张图片

总结:

activity内部子类调用主线程(UI控件)的办法

你可能感兴趣的:(android,webview,tabhost,activitygroup)