Android TextView加载带有多张图片的HTML,并且解决图片造成的OOM

2023-11-16

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请注明本文出自 renxhui 的博客(http://blog.csdn.net/qq_34760508/article/details/70146189),请尊重他人的辛勤劳动成果,谢谢!

相信大家都有过需求需要加载从后台返回的部分HTML代码到我们的Android手机上需求,现有的android 原生控件有WebView 和 TextView 可以去加载HTML,由于现在的需求我们需要记载一段HTML代码在RecyclerView中显示去报,一开始我的思路直接就是直接在Item中镶嵌WebView,这个办法简单粗暴,我试了一下,结果发现不可以因为由于现在RecyclerView在滚动的时候不断地去刷新View ,导致如果在HTML有图片的话,也会不停的加载,这样是不行的,后来就转战TextView了 ,下面我们分析一下TextView。

首先我们要了解TextView加载HTML基本的方法

mTextView.setMovementMethod(ScrollingMovementMethod.getInstance());// 滚动
mTextView.setMovementMethod(LinkMovementMethod.getInstance());//设置超链接可以打开网页
Html.ImageGetter imageGetter = new Html.ImageGetter() {

        public Drawable getDrawable(String source) {
            Drawable drawable = null;
            URL url;
            try {
                url = new URL(source);
                //Android 4.4 以后这步需要放在子线程中去操作
                drawable = Drawable.createFromStream(url.openStream(), ""); // 获取网路图片  
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            //这个后面我们要用到,可以控制显示在Textview上的图片大小
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight());
            return drawable;
        }
    };
//这个第二个参数imageGetter是加载图片使用的,第三个参数是过滤标签使用的,我们后面要用到,做点击图片的处理
    mTextView.setText(Html.fromHtml(htmlforImage, imageGetter, null));

上面就是在网上可以百度到的基本操作,下面我们去做其他处理,其实就是加载图片的处理,比如图片的缩放和缓存
**重点内容**
我相信大部分同学在加载的话都会用webview去直接加载到一个Actiity中,这种的话webview就可以满足我们大本分的需求,可是现在我们需要把Html放在RecyclerView中去显示,webview就不在适用了,二用textview去加载就会出现各种问题,下面我们就去列出会出现的问题然后一一去解决他们

1, 在recyclerview滚动事会不断刷新Textview的内容,这个如果textview中只有文本的话当然不是问题,不过现在我们还包括图片,当然不能重复刷新,浪费流量,而且加载还特别慢,所以我们把加载过一次的图片缓存到本地就可以供下次加载使用了,不多少了,下面上代码

/**
* Created by jh on 2016/10/10.
*/
public class TextToHtmlUtils {

private Context mContext;
private Dialog mDialog;
private int mPosition;
private static TextToHtmlUtils mInstance;
private static HashMap<String, Bitmap> sPostDetialHashMap;
private static HashMap<String, HashMap<String, Bitmap>> sHashMapHashMap;
public static String TEAM_NEWS = "team_news";
public static String POST_DETIAL = "post_detial";
private static HashMap<String, Bitmap> sTeamNewsHashMap;

public TextToHtmlUtils() {
    EventBus.getDefault().register(this);
}

public static TextToHtmlUtils getInstance() {
    if (mInstance == null) {
        synchronized (OkHttpManager.class) {
            if (mInstance == null) {
                mInstance = new TextToHtmlUtils();
                //用map来存储图片,为之后回收图片做准备
                sHashMapHashMap = new HashMap<>();
                sPostDetialHashMap = new HashMap<>();
                sTeamNewsHashMap = new HashMap<>();
            }
        }
    }
    return mInstance;
}

public void getBitmap(final ToHtml compressBitmap, final String url, final Context context,
                      final TextView textView, int position, final String type) {
    this.mPosition = position;
    this.mContext = context;
    //利用Rxjava去处理线程,把耗时线程放在子线程中
    Observable.create(new Observable.OnSubscribe<CharSequence>() {
        @Override
        public void call(Subscriber<? super CharSequence> subscriber) {
            //这里去加载图片
           // CharSequence test = Html.fromHtml(url);
            textView.setText("loading...");
            CharSequence getbitmap = getbitmap(url, type);
            subscriber.onNext(getbitmap);
            subscriber.onCompleted();
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<CharSequence>() {
                @Override
                public void onNext(CharSequence bitmap) {
                    compressBitmap.toFile(bitmap);
                }

                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }
            });
}

private CharSequence getbitmap(String url, final String type) {
    Html.ImageGetter imageGetter = new Html.ImageGetter() {

        @Override
        public Drawable getDrawable(String source) {
            URL url;
            Drawable drawable = null;
            try {
                String filename = checkUrl(source);
                String saveFilePaht = Constants.IMAGE + filename;
                File file = new File(saveFilePaht);
                //判断图片是否已经存储
                if (!file.exists()) {
                    Response response = OkHttpManager.getInstanceSimaple(mContext).getAsyn1(source);
                    byte[] bytes = response.body().bytes();
                    //利用BitmapFactory去显小图片避免oom,关于BitmapFactory不会用的自行百度
                    BitmapFactory.Options opts = new BitmapFactory.Options();
                    opts.inJustDecodeBounds = true;
                    //BitmapFactory.decodeStream(inputStream, null, opts);
                    BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
                    //根据你想要的图片的大小去自动计算缩小倍数
                    int i = computeSampleSize(opts, -1, 1000 * 1000);
                    opts.inSampleSize = i;
                    opts.inJustDecodeBounds = false;
                    opts.inInputShareable = true;
                    opts.inPurgeable = true;
                    opts.inPreferredConfig = Bitmap.Config.ARGB_4444;
                    //把byte转换为bitmap
                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
                    BitmapUtils.compressAndSaveBitmapToSDCard(bitmap, filename, 80);
                    drawable = BitmapUtils.bitmaptodrawable(bitmap);
                    //吧bitmap存到map中
                    if (type.equals(POST_DETIAL)) {
                        sPostDetialHashMap.put(filename, bitmap);
                        sHashMapHashMap.put(type, sPostDetialHashMap);
                    } else if (type.equals(TEAM_NEWS)) {
                        sTeamNewsHashMap.put(filename, bitmap);
                        sHashMapHashMap.put(type, sTeamNewsHashMap);
                    }
                    Logger.d("mmmmHtml","不存在");
                } else {
                    boolean recycle = isRecycle(filename, type);
                    //图片已经存在,去内存中或者本地去加载
                    if (recycle) {
                    //内存中不存在,本地加载
                        Bitmap bitmap = BitmapUtils.getBitmapInputStreamFromSDCard(filename);
                        drawable = BitmapUtils.bitmaptodrawable(bitmap);
                        if (type.equals(POST_DETIAL)) {
                            sPostDetialHashMap.put(filename, bitmap);
                            sHashMapHashMap.put(type, sPostDetialHashMap);
                        } else if (type.equals(TEAM_NEWS)) {
                            sTeamNewsHashMap.put(filename, bitmap);
                            sHashMapHashMap.put(type, sTeamNewsHashMap);
                        }
                        Logger.d("mmmmHtml","SD卡");
                    } else {
                    //内存加载
                        HashMap<String, Bitmap> stringBitmapHashMap = sHashMapHashMap.get(type);
                        Bitmap bitmap = stringBitmapHashMap.get(filename);
                        drawable = BitmapUtils.bitmaptodrawable(bitmap);
                        Logger.d("mmmmHtml","Map");
                    }

                }
                //drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                //这个方法去计算你想要的图片的大小
                matchDrawable(drawable);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return drawable;
        }
    };
    CharSequence test = Html.fromHtml(url, imageGetter, new MyTagHandler());
    return test;
}

private boolean isRecycle(String filename, String type) {
    if (sHashMapHashMap.containsKey(type)) {
        HashMap<String, Bitmap> stringBitmapHashMap = sHashMapHashMap.get(type);
        if (stringBitmapHashMap.containsKey(filename)) {
            Bitmap bitmap1 = stringBitmapHashMap.get(filename);
            boolean recycled = bitmap1.isRecycled();
            return recycled;
        }
    }
    return true;
}


private void matchDrawable(Drawable drawable) {
    if (drawable.getIntrinsicHeight() < 300 && drawable.getIntrinsicWidth() < 500 &&
            drawable.getIntrinsicHeight() > 10 && drawable.getIntrinsicWidth() > 10) {
        float i = 800 / drawable.getIntrinsicWidth();
        float j = 400 / drawable.getIntrinsicHeight();
        if (i <= j) {
            int width = (int) (drawable.getIntrinsicWidth() * j);
            int height = (int) (drawable.getIntrinsicHeight() * j);
            drawable.setBounds(0, 0, width, height);
        } else {
            int width = (int) (drawable.getIntrinsicWidth() * i);
            int height = (int) (drawable.getIntrinsicHeight() * i);
            drawable.setBounds(0, 0, width, height);
        }

    } else {
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    }
}


private String checkUrl(String source) {
    String[] split = source.split("/");
    for (String sp : split) {
        if (sp.equals("attachments")) {
            String s = split[split.length - 1];
            return s;
        }
    }
    String s = split[split.length - 3];
    return s;
}

public static abstract class ToHtml {
    public abstract void toFile(CharSequence bitmap);
}

/**
 * 用来通知当解析器遇到无法识别的标签时该作出何种处理
 */
class MyTagHandler implements Html.TagHandler {


    /**
     * 参数:
     * opening:为true时表示某个标签开始解析,为false时表示该标签解析完
     * tag:当前解析的标签
     * output:文本中的内容
     * xmlReader:xml解析器
     */
    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

        if (tag.toLowerCase().equals("img")) {//解析<img/>标签(注意标签格式不是<img></img>)
            //  Logger.e("opening-->", opening + "");
            int len = output.length();
            ImageSpan[] images = output.getSpans(len - 1, len, ImageSpan.class);
            String imgURL = images[0].getSource();
            //添加点击事件
            output.setSpan(new ImageClickSpan(mContext, imgURL), len - 1, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        } else if (tag.equalsIgnoreCase("strike")) {//自定义解析<strike></strike>标签
            int len = output.length();
            Logger.e("opening-->", opening + "");
            if (opening) {//开始解析该标签,打一个标记
                output.setSpan(new StrikethroughSpan(), len, len, Spannable.SPAN_MARK_MARK);
            } else {//解析结束,读出所有标记,取最后一个标记为当前解析的标签的标记(因为解析方式是便读便解析)
                StrikethroughSpan[] spans = output.getSpans(0, len, StrikethroughSpan.class);
                if (spans.length > 0) {
                    for (int i = spans.length - 1; i >= 0; i--) {
                        if (output.getSpanFlags(spans[i]) == Spannable.SPAN_MARK_MARK) {
                            int start = output.getSpanStart(spans[i]);
                            output.removeSpan(spans[i]);
                            if (start != len) {
                                output.setSpan(new StrikethroughSpan(), start, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            }
                            break;
                        }
                    }
                }
            }
        } else {//其他标签不再处理
        }
    }
}

class ImageClickSpan extends ClickableSpan {

    private Context context;
    private String url;


    public ImageClickSpan(Context context, String url) {
        this.context = context;
        this.url = url;
    }

    @Override
    public void onClick(View widget) {
        showPicDialog(url);
    }


}


private void showPicDialog(String url) {
    String filename = checkUrl(url);
    String saveFilePaht = Constants.IMAGE + filename;
    Intent intent = new Intent(mContext, BigImageActivity.class);
    intent.putExtra("path", saveFilePaht);
    mContext.startActivity(intent);
}

public static int computeSampleSize(BitmapFactory.Options options,
                                    int minSideLength, int maxNumOfPixels) {
    int initialSize = computeInitialSampleSize(options, minSideLength,
            maxNumOfPixels);

    int roundedSize;
    if (initialSize <= 8) {
        roundedSize = 1;
        while (roundedSize < initialSize) {
            roundedSize <<= 1;
        }
    } else {
        roundedSize = (initialSize + 7) / 8 * 8;
    }

    return roundedSize;
}

public static int computeInitialSampleSize(BitmapFactory.Options options,
                                           int minSideLength, int maxNumOfPixels) {
    double w = options.outWidth;
    double h = options.outHeight;

    int lowerBound = (maxNumOfPixels == -1) ? 1 :
            (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
    int upperBound = (minSideLength == -1) ? 128 :
            (int) Math.min(Math.floor(w / minSideLength),
                    Math.floor(h / minSideLength));

    if (upperBound < lowerBound) {
        return lowerBound;
    }

    if ((maxNumOfPixels == -1) &&
            (minSideLength == -1)) {
        return 1;
    } else if (minSideLength == -1) {
        return lowerBound;
    } else {
        return upperBound;
    }

//回收bitmap
public void clearBitmap(String type) {
    for (String type1 : sHashMapHashMap.keySet()) {
        if (type1.equals(type)) {
            HashMap<String, Bitmap> stringBitmapHashMap = sHashMapHashMap.get(type1);
            for (String path : stringBitmapHashMap.keySet()) {
                Bitmap bitmap = stringBitmapHashMap.get(path);
                if (!bitmap.isRecycled() && bitmap != null) {
                    bitmap.recycle();
                    Logger.d("mmmrecyBitmapeventbus", bitmap.toString() + type1);
                }
            }
        }
    }
}

}
}

经过上面一系列的操作就可以在recyclerview中加载了
在activity调用如下

TextToHtmlUtils instance = getInstance();
instance.getBitmap(new TextToHtmlUtils.ToHtml() {
@Override
public void toFile(CharSequence html) {
holder.mTextView.setText(html);
}
}, Html, context, holder.mtextview, position,TextToHtmlUtils.POST_DETIAL);

最有谢谢大家观看,有什么更好的建议请留言给我

源码已经上传github
网址https://github.com/renxh4/TextViewForHtml
喜欢的话记得点一下关注哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android TextView加载带有多张图片的HTML,并且解决图片造成的OOM 的相关文章

  • 如何使用 HTML 5 实现类似 gmail 的文件上传/附件

    我记得一些支持 Ajax 之类的选项 无回发世界 文件上传 隐藏的 iframe 使用 flash 对象 尽管我仍然好奇为什么使用 SWF 以及它提供什么优势 然而 通过查看博客 HTML 5 似乎很有前途 我尝试了一些小示例 它确实有效
  • 不变违规:requireNativeComponent:在 UIManager 中找不到“RNSVGSvgViewAndroid”

    我对标题中提到的错误感到头疼 我正在使用react native gifted charts https www npmjs com package react native gifted charts v 1 0 3 https www
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 如何处理 Django 中的错误

    我想让我的 django 应用程序尽可能对用户友好 并且我想处理适当的错误并让它推出类似于 javascript 中的警报的错误消息 我想在没有上传文件时执行此操作 因此 当按下上传按钮并且尚未上传任何内容时 将会发出一条警报消息 我的看法
  • 当不支持 Google Play 应用内结算 V.3 时

    在 Google Play 的应用内结算 V 3 中 有一个选项可以检查用户设备是否支持它 使用是否支持计费 http developer android com google play billing versions html meth
  • 水平滚动的表格上的“粘性”标题......完全不可能?

    经过过去几个小时的研究后 我开始认为这是不可能的 即使在最新的浏览器上也是如此 HTML table具有水平滚动的元素 带有 粘性 thead在顶部 作为垂直滚动的周围网页的一部分 这是我的尝试 a height 100px backgro
  • 使用 Android Firebase 堆栈推送通知

    我开发了使用 Firebase 接收推送通知的 Android 应用程序 我的代码基于 Firebase Google 官方文档 https firebase google com docs cloud messaging android
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • android textview 有字符限制吗?

    我正在尝试在 android TextView 中输入超过 2000 3000 个字符 它不显示任何内容 任何一份指南是否对 android textview 有字符限制或什么 我在G3中做了一些小测试 我发现 如果activtiy布局中有
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 如何在 Android 上将动态 alpha 遮罩应用于文本

    I want to make a dynamic alpha mask with drawable shapes as circles or whatever and apply it to a drawed text on Android
  • 剪切评级栏中的图像

    我制作了自己的评级栏 花朵图像有 4 种尺寸 xdpi hdpi 等 从 24px24px 到 64x64px
  • 适用于移动设备的响应式订单确认电子邮件?

    我从未见过令人惊叹的订单确认 发票电子邮件 即使是最好的 html5 网站也会发送糟糕的订单确认电子邮件 有时是纯文本 我相信这是因为发票通常需要使用表格来显示购买的物品 这在移动设备上实现起来非常困难 我发现了一些让手机上的表格更易于管理
  • 在 Android 手机中通过耳机插孔发送数据

    我目前正在处理一个新项目 我必须通过具有特定电压的耳机插孔发送数据 然后我可以在该电压上工作 所以这里我需要根据我的数据来编程具体电压 我是否可以在android中访问耳机的输出电压 然后创建一个应用程序来控制该电压 这是一篇讨论此问题的
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒

随机推荐

  • springboot项目启动报错:java.io.EOFException: null

    springboot项目启动时报 java io EOFException null异常 但是不影响功能 可能原因是由于tomcat上次非正常关闭时有一些活动session被持久化 表现为一些临时文件 在重启时 tomcat尝试去恢复这些s
  • ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

    参考 Linux之ARM IMX6U 裸机汇编LED驱动实验 驱动编写 作者 一只青木呀 发布时间 2020 08 07 09 13 48 网址 https blog csdn net weixin 45309916 article det
  • Masm for Winodws 集成实验环境安装绿色免费版

    Masm for Winodws 集成实验环境安装绿色免费版 用于汇编的开发环境 绿色安全下载途径 希望能帮到有需要的人 不喜勿喷 提取文件后解压后 打开文件下载安装即可 百度网盘下载 链接 https pan baidu com s 1U
  • notepad++ 配置 python 以及Anaconda中的python(已解决)

    说明 无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的 区别就是 独立安装的python 的exe文件路径添加的环境变量了 不需要制定它的路径直接运行下面的命令就可以 而Anaconda中的p
  • 常用js

    1 去掉字符串两端的空格 对字符串去两端空格 function stringTrim str if str null str undefined return null 用正则表达式将前后空格 用空字符串替代 return str repl
  • win10中不同版本jdk切换

    1 设置系统变量 java home8 java home8 以及java home 2 若无法切换jdk版本 可以在系统变量path中 删除默认路径 3 测试版本切换是否成功 一定要重启cmd
  • 使用mongodb数据库+node.js封装接口详细过程

    学习内容 使用mongodb存储数据 用node语言编写后端 学习产出 下载mongoose依赖包 npm install mongoose 创建一个js文件 keys js 文件写入路径配置 模块入口 module exports mon
  • python(六)——函数

    函数 函数 定义函数 传递实参 位置实参 关键字实参 形参默认值 缺省参数 多值参数 多值参数拆包 返回值 使用默认值让实参变为可选 通过容器返回多个变量 通过列表返回 元组返回多个返回值 函数的注释 模块 模块的定义 导入特定的函数 给导
  • 修改maven的默认镜像为阿里镜像

    在maven的配置文件中 默认的镜像仓库地址为 http repo maven apache org maven2 该地址下载jar包速度慢一些 这里可以修改为阿里的镜像仓库地址 http maven aliyun com nexus co
  • Node.js 版本管理工具 n 使用指南

    Node js 版本更新很快 目前 node v20 x 已经发布 我们在使用时避免不了会需要切换不同的 Node js 的版本来使用不同版本的特性 所以就出现了像 windows 上的 nvm MacOS 上的 n 工具 本文就介绍一下如
  • super class java_Java中的getGenericSuperclass的基本用法

    通过getGenericSuperclass方法可以获取当前对象的直接超类的Type 使用该方法可以获取到泛型T的具体类型 package cn tzz lang clazz public class User private Intege
  • IDEA查询项目中未被使用的代码

    IDEA查询项目中未被使用的代码 IDEA内置的很多功能非常强大 通过analyze分析功能 可以实现根据自己需求来检索未使用的内容 步骤如下 在弹出的输入框中 输入undeclared 然后选择下拉框中箭头指向内容 双击 下图中的选择方式
  • XML中的转义

    在XML中 有一些符号作为XML 的标记符号 一些特定情况下 属性值必须带有这些特殊符号 下面主要是讲解一些常用的特殊符号的处理 例一 双引号的使用 双引号作为XML 属性值的开始结束符号 因此无法在值中直接使用 处理方式可以分为两种 a
  • 时间序列分析全集-python3

    文章目录 1 导言 1 1 基本定义 1 2 预测评估指标 2 移动 平滑 评估 2 1 滑动窗口估计 2 1 1 moving average 2 1 2 weighted average 2 2 指数平滑 2 2 1 exponenti
  • U盘安装CentOS7

    官网找到CentOS7的ISO镜像 CentOS 7 x86 64 DVD 2207 02 iso 大小4 42G 准备一个8G的U盘 格式化 然后通过UltraISO工具将ISO镜像写入到U盘 接着开机启动U盘 华硕是按esc键 选择in
  • pip install 快速下载和安装包的方法

    一个 快速下载和安装包的方法 转载自他人 见下面链接 输入指令 pip default timeout 100 install 库名称 i http pypi douban com simple trusted host pypi doub
  • 在geany中使用中文注释

    geany中使用中文注释如果不加以特别说明会报错误 像这样 只需在首行指定编码格式 就可以愉快使用中文注释了 coding utf 8 coding utf 8 magicians alice david altman for magici
  • 通俗易懂的RNN

    目录 一 什么是RNN 二 为什么要发明RNN 三 RNN的基础知识 1 循环核介绍 2 循环核按时间步展开 3 记忆体 4 循环计算层 5 TF描述循环计算层 二 RNN的补充知识 1 RNN梯度消失的原因 一 什么是RNN RNN Re
  • 字符大全

    icon a m1 爱心符号 心形符号 扑克符号 1 m2 笑脸符号 2 gt c m3 商标符号 版权符号大全 3
  • Android TextView加载带有多张图片的HTML,并且解决图片造成的OOM

    版权声明 本文为博主原创文章 未经博主允许不得转载 转载请注明本文出自 renxhui 的博客 http blog csdn net qq 34760508 article details 70146189 请尊重他人的辛勤劳动成果 谢谢