🌒MoonLab

> 在MoonLab中搜索

  1. 1. 架构
  2. 2. 全局异常处理
  3. 3. JSON解析
  4. 4. 图片宽度太宽啦
  5. 5. Html显示
  6. 6. 2020更新

知乎日报的坑

Category: Programming

🏷️  Android   中文

没想到吧!本鸽子想起自己的博客啦!

暑假到了,感觉时间跟不要钱一样,没有了时间概念了233

我实在没啥可写的,就随便说说这两天干了啥吧

昨天我开始写一个第三方的知乎日报客户端

因为太无聊了,就随便搞搞吧。用的是这个API

简单说一下之前遇到的问题吧,以及开发的过程

架构

用的是MVP,也就是Model, View, Presenter

感觉有点麻烦,其实现在有点后悔了,写起来太无聊啦

最开始当然是疯狂写写写写接口,创建Activity

后面则是疯狂用用用用别人的轮子

全局异常处理

自己写了个全局异常处理实现Thread.UncaughtExceptionHandler这个接口。

然后再把自己的Application搞上去,在MyApplication中把默认的ExceptionHandler给搞下去!

在uncaughtException方法中写入处理异常的代码,这里是不能使用AlertDialog的!!!

我是直接跳转到专门的ExceptionActivity处理,这样用户体验就更棒了(其实没啥用)

但但但但但是!!!

不知道为啥在uncaughtException中Throwable的printStackTrace方法失效了,我也没有深究,也懒得管啦

JSON解析

没啥意思,就那样JSONOBJECT, JSONARRAY,懒得用别人的轮子233

应用中需要加载图片,我并没有考虑Glide,我使用了OkHttp框架,而Picasso也用到了OkHttp,况且Picasso更轻量,在某种情况下个人感觉Picasso比Glide更好用

图片宽度太宽啦

这个Webview的图片超过了屏幕的宽度,我在网上查了一下 WenView 图片自适应

找到了一个方法,就是加载JavaScript,这可能是一个本方法但管用

像我这种五线水平,也就只能这样惹QAQ

webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                String javascript = "javascript:function ResizeImages() {" +
                        "var myimg,oldwidth;" +
                        "var maxwidth = document.body.clientWidth;" +
                        "for(i=0;i <document.images.length;i++){" +
                        "myimg = document.images[i];" +
                        "if(myimg.width > maxwidth){" +
                        "oldwidth = myimg.width;" +
                        "myimg.width = maxwidth;" +
                        "}" +
                        "}" +
                        "}";
                view.loadUrl(javascript);
                view.loadUrl("javascript:ResizeImages();");
            }
        });

Html显示

推荐一个整理json的工具:http://www.bejson.com/

在文章接口中,它会返回一个html代码,也就是文章内容,例如

html有点长,不放了

Emmmmmm,你懂我意思就行了,很多这种内容型项目的语法都是用html的,而不是markdown

这里我遇到了一个坑,最开始我以为只需要用TextView显示html就行了

但实际结果很不尽人意,图片显示的效果很差,图片都太小了

这是一个很严重的问题

我开始怀疑人生…

想到用Webview加载,但是害怕竹篮打水一场空,就分析了一下官方的知乎日报

似乎的确是使用WebView的,这是返回的json

{
      body: "<div class="main-wrap content-wrap">...</div>",
      image_source: "Yestone.com 版权图片库",
      title: "深夜惊奇 · 朋友圈错觉",
      image: "http://pic3.zhimg.com/2d41a1d1ebf37fb699795e78db76b5c2.jpg",
      share_url: "http://daily.zhihu.com/story/4772126",
      js: [ ],
      recommenders": [
          { "avatar": "http://pic2.zhimg.com/fcb7039c1_m.jpg" },
          { "avatar": "http://pic1.zhimg.com/29191527c_m.jpg" },
          { "avatar": "http://pic4.zhimg.com/e6637a38d22475432c76e6c9e46336fb_m.jpg" },
          { "avatar": "http://pic1.zhimg.com/bd751e76463e94aa10c7ed2529738314_m.jpg" },
          { "avatar": "http://pic1.zhimg.com/4766e0648_m.jpg" }
      ],
      ga_prefix: "050615",
      section": {
          "thumbnail": "http://pic4.zhimg.com/6a1ddebda9e8899811c4c169b92c35b3.jpg",
          "id": 1,
          "name": "深夜惊奇"
      },
      type: 0,
      id: 4772126,
      css: [
          "http://news.at.zhihu.com/css/news_qa.auto.css?v=1edab"
      ]
  }

可以看到有一条 css,官方的知乎日报显示的效果,与网页不同

看来就是加载了这个css吧,我还以为有什么其他高科技呢!

毕竟效率第一嘛,这样做的好处也是有的

我们只需要在 Model 层中对 javabean 的正文属性做一些修改就可以了

最后加载css后发现整个世界都不一样了

(事实上最后加载css后发现,知乎日报提供的css根本就不用考虑 img 标签的宽度太大,人家自懂帮忙处理好的 QAQ)

(而且加载css还会给官方的知乎日报app留白)

这其中不难发现 Android客户端 与负责 Web 的开发人员之间的合作,这很常见(当然也可能是一位全栈工程师吧)

Tips: 如果WebView

但我还没感受过这种合作呢,哭惹

现在完成了简单的加载和查看

只做完了六分之一吧,甚至更少(哭哭)

1
1

2
2

3
3

4
4

2020更新

基本上已经完成了,主要是写完了分页加载,垃圾代码随便看看吧:Github (https://github.com/HelloLingC/zhihu-daily-open)

2018-2023 MoonLab