不用Webview加载复杂静态布局的方法

前提条件:有接口返回json,key和value比较多,层级比价多。下面有4种方法将数据转为视图。

  • 遍历json数据取出相应的key,排好层级关系,将静态html转成字符串替换对应的占位符,比如"{zhongguo guangdong three}"来占位,最后替换String,后面发现webview兼容和性能问题,而且也不太想为了这个功能而加入X5内核
  • 通过解析html转成对应的原生控件,但是前提是要定义好对应关系,感觉有点不够灵活了,比较像webview
  • 写好静态布局,通过设置tag来占位,最终找到对应的tag来设置string,这个操作与处理html的逻辑相同
  • 通过LayoutInflater.from(getContext()).inflate(xmlPullParser, vContainer);这个方法加载处理好的xml,适合加载远程的数据,不然你就要将处理过的xml保存到本地,再从本地去加载,这样多了一步,感觉没必要。以下是尝试跳过保存这一方法的实验过程
                        parser = XmlPullParserFactory.newInstance().newPullParser();
                        //XmlPullParser parser = createXmlPullParserToAssets(getContext(), "live_mingpan_layout.xml", 0);
                        //parser.setInput(inputStream, "utf-8");
                        InputStreamReader inputStreamReader = new InputStreamReader(new StringBufferInputStream(data));
                        parser.setInput(inputStreamReader);

报错
android.util.XmlPullAttributes cannot be cast to android.content.res.XmlBlock$Parser
https://stackoverflow.com/questions/28201785/error-generating-android-resource-from-xml-string?r=SearchResults

然后用这个方法

    /**
     * 获取bin文件中的xml文件
     *
     * @param ctx         上下文
     * @param binFileName bin文件名
     * @param position    文件偏移量
     * @return
     */
    public static XmlPullParser createXmlPullParserToAssets(Context ctx, String binFileName, int position) {
        byte[] buffer = null;   // 文件内容
        int len = -1;           // 文件长度

        try {
            InputStream in = ctx.getResources().getAssets().open(binFileName, AssetManager.ACCESS_RANDOM);
            try {
                in.skip(position);

                // 文件长度
                len = (in.read() & 0xFF) << 24;
                len |= (in.read() & 0xFF) << 16;
                len |= (in.read() & 0xFF) << 8;
                len |= (in.read() & 0xFF);

                // 读取文件内容
                buffer = new byte[len];
                in.read(buffer);
            } finally {
                in.close();
            }

            if (null == buffer || buffer.length <= 0 || len <= 0) {
                return null;
            }

            try {
                Class clazz = Class.forName("android.content.res.XmlBlock");
                Constructor constructor = clazz.getDeclaredConstructor(byte[].class);
                constructor.setAccessible(true);
                Object xmlBlock = constructor.newInstance(buffer);

                Method method = clazz.getDeclaredMethod("newParser");
                method.setAccessible(true);
                return (XmlPullParser) method.invoke(xmlBlock);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
//    原文:https://blog.csdn.net/junjunyanyan/article/details/45674337

应该是因为xml太大上面的方法直接oom
我把这个改成

 Class clazz = Class.forName("android.content.res.XmlBlock");
                                       Constructor constructor = clazz.getDeclaredConstructor(byte[].class);
                                       constructor.setAccessible(true);
                                       InputStreamReader inputStreamReader = new InputStreamReader(new StringBufferInputStream(data));
                                       Object xmlBlock = constructor.newInstance(inputStreamReader);

                                       Method method = clazz.getDeclaredMethod("newParser");
                                       method.setAccessible(true);
                                       XmlPullParser parser1 = (XmlPullParser) method.invoke(xmlBlock);
                                       View inflate = LayoutInflater.from(getContext()).inflate(parser1, vContainer);
                                       

然并卵,参数只能传buffer不能传inputStreamReader
老老实实写好静态布局,根据匹配view对应tag来设置text。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值