前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年遇到的bug(2)

那些年遇到的bug(2)

作者头像
用户1337002
发布2018-03-09 10:31:40
8910
发布2018-03-09 10:31:40
举报
文章被收录于专栏:猿份到

bug系列又出炉了,过来瞧瞧啦

1、webview常出现的问题

之前android虚拟机一直都可以直接联网,今天写了一个WebView之后,突然报出了Web page not available的错误,但是查看虚拟机自带的浏览器,是可以上网的,所以检查还是代码的问题,这里给大家列出一些android开发中使用WebView时需要注意的一些小细节,大家共享。

1、首先是出现Web page not available的解决方案:

检查AndroidManifest.xml是否添加了权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET"

添加方法:在与<application>同级的地方添加

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET"/>

2、在要Activity中生成一个WebView组件:

代码语言:javascript
复制
WebView webView = new WebView(this);

3、设置WebView基本信息: 如果访问的页面中有Javascript,则webview必须设置支持Javascript。

代码语言:javascript
复制
 webview.getSettings().setJavaScriptEnabled(true);  

触摸焦点起作用

代码语言:javascript
复制
       requestFocus();

取消滚动条

代码语言:javascript
复制
       this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);

4、设置WevView要显示的网页: 互联网用:

代码语言:javascript
复制
webView.loadUrl("http://www.google.com"); 

本地文件用,本地文件存放在:assets文件中

代码语言:javascript
复制
webView.loadUrl("file:///android_asset/XX.html");  

5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。 给WebView添加一个事件监听对象(WebViewClient),并重写其中的一些方法 shouldOverrideUrlLoading:对网页中超链接按钮的响应。 当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url

shouldOverrideUrlLoading包含的方法:

  1. onLoadResource
  2. onPageStart
  3. onPageFinish
  4. onReceiveError
  5. onReceivedHttpAuthRequest

6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。 覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

代码语言:javascript
复制
    public boolean onKeyDown(int keyCoder,KeyEvent event){
            if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                   webview.goBack();   //goBack()表示返回webView的上一页面
                   return true;
                  }
           return false;
       }

2、网络405错误 用andorid的URLHttpConnection类。其他的请求都没有问题,偏偏就这一个请求出405错误。

去网上查,和做服务器交互都木有解决。奇葩的我在java工程里写的代码ok,但是在android工程里相同的代码就出405。

然后尝试着把setDoOutput(true)这句代码注释(默认是false)掉以后,竟然好了。想来想去可能是谷歌对java的URLConnection类做了更改。

这个问题应该很少遇到,写出来的目的是希望大家到时候少浪费一些不必要的时间。注意:在4.0 的版本上可能会出现

3、友盟自动更新未实现

自动更新提示无法安装

在项目中使用自动更新服务,通过调用查看日志的代码。发现以下的日志信息:

代码语言:javascript
复制
04-13 14:29:03.761: I/u.upd.g(9737): 212: response: 
04-13 14:29:03.761: I/u.upd.g(9737): {"update":"Yes","version":"1.0","path":"http://au.apk.umeng.com/uploads/apps/551ca857fd98c51076001a39/_umeng_%40_2_%40_ae5657334c1b05bfad5038796907f3af.apk","origin":"","update_log":"最新版本:2.0\r\n最新版本大小:3320k\r\n更新内容:\r\n1、添加有米广告\r\n2、添加友盟自动更新服务","proto_ver":"1.4","delta":false,"new_md5":"ae5657334c1b05bfad5038796907f3af","size":"3296443","patch_md5":"","target_size":"3296443","display_ads":true}
04-13 14:29:03.761: W/com.umeng.update.UmengUpdateAgent(9737): java.lang.ClassNotFoundException: com.umeng.message.PushAgent: [isIncludesUmengPushSDK]
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atjava.lang.Class.classForName(Native Method)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atjava.lang.Class.forName(Class.java:308)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atjava.lang.Class.forName(Class.java:272)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.umeng.update.UmengUpdateAgent.c(UmengUpdateAgent.java:57)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.umeng.update.UmengUpdateAgent.b(UmengUpdateAgent.java:682)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.umeng.update.UmengUpdateAgent.a(UmengUpdateAgent.java:27)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.umeng.update.UmengUpdateAgent$1.handleMessage(UmengUpdateAgent.java:268)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atandroid.os.Handler.dispatchMessage(Handler.java:102)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atandroid.os.Looper.loop(Looper.java:135)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atandroid.app.ActivityThread.main(ActivityThread.java:5258)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atjava.lang.reflect.Method.invoke(Native Method)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atjava.lang.reflect.Method.invoke(Method.java:372)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
04-13 14:29:03.766: W/com.umeng.update.UmengUpdateAgent(9737):         atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

分析:可以从以下的几方面去寻找:

1、上传到服务器的版本是否大于当前版本号

2、versioncode和version name的值是否改变

3、是否做了混淆代码的处理 我最后出现的问题就是:代码没有混淆,所以打包后出错了,通过这三步,一步步的排查,最后成功实现了自动更新服务,希望大家认真仔细排查

4、使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI

由于系统原因,重新安装了系统,但是当我重新运行genymotion的时候,把Android运用部署到上面调试时,

console控制台会报错:

代码语言:javascript
复制
Installation error: INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

这是因为系统里缺少了 Google Play 市场等各种谷歌服务应用,其实是因为版权问题,从 2.0 版本开始 Genymotion 提供的虚拟设备都已经移除了 Google Apps 以及 ARM library support

所以,如果通过软件里下载回来的虚拟机在运行一些必须依靠这些组件运行的 App 时就会出现错误或闪退现象。

解决办法:

  1. 下载Genymotion-ARM-Translation.zip
  2. 运行Genymotion,并start你配置好的virtual device
  3. 将下载好的Genymotion-ARM-Translation.zip直接拖动到virtual device,然后点击ok:
  4. 最后会弹出安装成功的信息

5.关闭virtual device以及Genymotion,重新启动。

再次部署Android应用在上面就可以成功了

5、调试成功、运行失败

在一次项目中,有一个数据迟迟不能出来,后来经过多番的调试,数据结果能运行出来,但是一旦进入直接运行,结果就是显示不出来,通过system输出和打印log都没有发现问题,但是在逐步排查中发现,有一个数据的值没有获取到,但是奇怪的是在调试过程中那个数据的值还是获取到了。所以反复尝试,将代码的位置调整后,结果就出来了。

请注意:一定要先声明;赋值后再去调用。

6、ERROR: 9-patch错误

代码语言:javascript
复制
image D:\test\res\drawable-hdpi\slot_reward_item_mask.9.png malformed

翻译出来的就是这张图片是畸形的,那么就很明显是图片的问题啦,然后查阅资料发现:

原来是.9图没做好,只做了一边,还需要另一边,即左边和上边必须加上。

终于重新处理了.9图片就好了,你们是否遇到过呢?

好了,今天就到此为止了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿份到 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档