如何解决控件会导致 "pdlrt.exe" 内存消费需求与经济增长的不断增长

Wincc在 OS 上组态一个组合框 Combo box_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Wincc在 OS 上组态一个组合框 Combo box
上传于|0|0|文档简介
&&Wincc在 OS 上组态一个组合框 Combo box
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢扫码下载APP
随时选购服务
需求发布后1小时内收到服务商响应每个需求平均有10个服务商参与95%以上的需求得到了圆满解决所有需求不向雇主收取任何佣金好的包装增加视觉销售力
寻求:释放Webbrowser控件加载网页时占用大量内存的方法(C#.net )
寻求:释放Webbrowser控件加载网页时占用大量内存的方法(C#.net )
雇主预算:¥300.00
已收到 4 个服务商的文案稿件
有相似问题想解决?专业顾问来帮助您
通过猪八戒网实名认证,保证身份真实可靠
完成手机认证,保证能随时联系到服务商
该需求下的优秀交稿
TA的交稿:
Application.Restart();
TA的交稿:
Webbrowser控件相当于开了一个IE窗口,在不停浏览网页的同时为了提高性能自然会消耗一定的内存,这些类似缓存的内存消耗是没有办法释放的,除非你把Webbrowser整个控件释放掉。释放控件可...
交易成功的需求
其它工具软件相关需求Android笔记(86)
最近优化项目代码时,发现一个比较诡异的现象:每当界面进入ActivityA时,cpu在不断的消耗,内存在不断的缓慢增长(虽然每次增长的量非常小)。如下图:
12.26.07.png
最后经过仔细排查发现是由别的组成员自定义view造成的,这个自定义view代码如下:
RightDrawableButton.java
public class RightDrawableButton extends Button {
protected void onDraw(Canvas canvas) {
Drawable[] drawables = getCompoundDrawables();
if (drawables != null) {
Drawable drawableLeft = drawables[2];
if (drawableLeft != null) {
float textWidth = getPaint().measureText(getText().toString());
int drawablePadding = getCompoundDrawablePadding();
int drawableWidth = 0;
drawableWidth = drawableLeft.getIntrinsicWidth();
float bodyWidth = textWidth + drawableWidth + drawableP
setPadding(0, 0, (int)(getWidth() - bodyWidth), 0);
canvas.translate((getWidth() - bodyWidth) / 2, 0);
super.onDraw(canvas);
相信看完代码大家应该知道代码想要实现的效果了:
让button的文本和drawableRight居中对齐。
实现的效果如下图:
16.31.46.png
有些朋友可能会认为:实现这个效果直接用button和drawableRight在XML中定义不就可以了么?大家可以自己试试哟
核心思想:
获取文本和drawable的总宽度bodyWidth移动canvas的坐标系到按钮的正中间
canvas.translate((getWidth() - bodyWidth) / 2, 0);
OK,最终效果是实现了,可是效率有极大的问题。问题就出在getCompoundDrawables()这行代码中,进入源码发现其实现为:
public Drawable[] getCompoundDrawables() {
final Drawables dr = mD
if (dr != null) {
return dr.mShowing.clone();
return new Drawable[] { null, null, null, null };
很明显,此方法要不创建新的Drawable数组,要不就clone() mDrawables数组。无论是克隆还是新建都将创建新的数组,这里虽然Java使用浅拷贝来拷贝数组,但是数组本身会重新创建(只是数组成员引用被拷贝的数组成员)。
onDraw方法中由于使用了setPadding而导致button会调用invalide()来进行重绘,这就导致了onDraw在不断的被调用。
大家可以想想,作者为什么将这些代码放到onDraw中执行:我想是为了如果button的文本发生变化时需要重新计算bodyWidth的缘故
经过上面的分析,我们可以进行优化如下:
1,不要在onDraw中调用getCompoundDrawables,毕竟在运行过程中修改drawable的需求不多
2,计算bodyWidth放在onLayout中进行
最终代码实现如下:
public class RightDrawableButton extends Button {
private final static String TAG = &RightDrawableButton&;
private Drawable[]
private float textW
private float bodyW
public RightDrawableButton(Context context) {
super(context);
public RightDrawableButton(Context context, AttributeSet attrs) {
super(context, attrs);
public RightDrawableButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
private void init(){
drawables = getCompoundDrawables();
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
textWidth = getPaint().measureText(getText().toString());
Drawable drawableRight = drawables[2];
int totalWidth = getWidth();
if (drawableRight != null) {
int drawableWidth = drawableRight.getIntrinsicWidth();
int drawablePadding = getCompoundDrawablePadding();
bodyWidth = textWidth + drawableWidth + drawableP
setPadding(0,0,(int)(totalWidth - bodyWidth),0);
public void setText(String text){
if(text.equals(getText().toString()))
super.setText(text);
requestLayout();
protected void onDraw(Canvas canvas) {
int width = getWidth();
canvas.translate((width - bodyWidth) / 2, 0);
super.onDraw(canvas);
得到运行结果如下(世界清静了):
16.57.26.png
如果你的代码是直接从网上扒的,请一定做好测试。
将问题提早暴露比后来再优化代码更加重要,如果个人能力有限请和同事们沟通解决方案,问题一定不能无限拖延下去(迟早要还的)
单就“让button的文本和drawableRight居中对齐”的问题其实完全有很多其它方法可以做到,不用非自己定义button来实现,比如:
用button实现,让其宽度为wrap_content
&RelativeLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@android:color/darker_gray&
android:gravity=&center_horizontal&&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:gravity=&center_vertical&
android:text=&Button&
android:drawableRight=&@android:drawable/ic_delete&/&
&/RelativeLayout&
用TextView实现
&RelativeLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:minHeight=&50dp&
android:background=&@android:color/darker_gray&
android:gravity=&center&&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:gravity=&center_vertical&
android:id=&@+id/id_text&
android:text=&textView&
android:drawableRight=&@android:drawable/ic_delete&/&
&/RelativeLayout&
自定义Button,自己实现drawableLeft和drawableRight,核心代码如下:
LGDrawableButton.java
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.LGDrawableButton, 0, 0);
textMarginRight = a.getDimension(R.styleable.LGDrawableButton_textMarginRight, 0);
textMarginLeft = a.getDimension(R.styleable.LGDrawableButton_textMarginLeft, 0);
setDrawable(a.getDrawable(R.styleable.LGDrawableButton_drawableLeft),
a.getDrawable(R.styleable.LGDrawableButton_drawableRight));
} finally {
a.recycle();
pl = getPaddingLeft();
pr = getPaddingRight();
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = 0;
int height = 0;
if (mDrawableRight != null) {
width += mDrawableRight.getIntrinsicWidth();
height = mDrawableRight.getIntrinsicHeight();
if (mDrawableLeft != null) {
width += mDrawableLeft.getIntrinsicWidth();
int drawableLeftHeight = mDrawableLeft.getIntrinsicHeight();
height = height & drawableLeftHeight ? height : drawableLeftH
setMeasuredDimension(Math.max(getMeasuredWidth(), width), Math.max(getMeasuredHeight(), height));
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mDrawableRight != null) {
textPaddingRight = mDrawableRight.getIntrinsicWidth() / 2;
if (mDrawableLeft != null) {
textPaddingLeft = mDrawableLeft.getIntrinsicWidth() / 2;
if (mDrawableLeft != null && mDrawableRight != null) {
textPaddingRight = 0;
textPaddingLeft = 0;
setPadding(pl + textPaddingLeft * 2 + (int)textMarginLeft / 2, getPaddingTop(),
pr + textPaddingRight * 2 + (int)textMarginRight / 2, getPaddingBottom());
public void setDrawable(final Drawable left, final Drawable right) {
state = getDrawableState();
if (left != null) {
left.setState(state);
left.setBounds(0, 0, left.getIntrinsicWidth(), left.getIntrinsicHeight());
left.setCallback(this);
if (right != null) {
mDrawableRight =
mDrawableLeft =
requestLayout();
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mDrawableRight != null) {
Rect rect = mDrawableRight.getBounds();
float textWidth = getPaint().measureText(getText().toString());
float drawableX = getWidth() / 2 + textWidth / 2 - textPaddingRight + textMarginRight / 2;
if (drawableX + rect.width() &= getWidth()) {
drawableX = getWidth() - rect.width();
canvas.save();
canvas.translate(drawableX, getHeight() / 2 - rect.bottom / 2);
mDrawableRight.draw(canvas);
canvas.restore();
if (mDrawableLeft != null) {
...和mDrawableRight类似
由于涉及到自定义属性,请在res的values目录下新建attrs.xml文件内容如下:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&declare-styleable name=&LGDrawableButton&&
&attr name=&drawableRight& format=&reference&/&
&attr name=&drawableLeft& format=&reference&/&
&attr name=&textMarginRight& format=&dimension&/&
&attr name=&textMarginLeft& format=&dimension&/&
&/declare-styleable&
&/resources&
在布局文件中定义如下:
&com.gui.lgdrawablebutton.LGDrawableButton
android:id=&@+id/center_left&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
app:textMarginLeft=&20dp&
android:text=&中国你好&
app:drawableLeft=&@android:drawable/ic_delete& /&
&com.gui.lgdrawablebutton.LGDrawableButton
android:id=&@+id/center_right&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:text=&中国你好&
app:textMarginRight=&20dp&
app:drawableRight=&@android:drawable/ic_delete& /&
&com.gui.lgdrawablebutton.LGDrawableButton
android:id=&@+id/center_both&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:text=&中国你好&
app:drawableRight=&@android:drawable/ic_delete&
app:drawableLeft=&@mipmap/ic_launcher&/&
实现效果如下:
20.12.10.png
尽量不要做个“拿来主义”的人,我个人认为网上的一些代码不是不能使用,只是我们要有自己的衡量:这些代码是不是能直接使用,还是说经过简单修改就能直接使用,还是根本就不能用。请做个有自己想法的“拿来主义”者,能显著提高你的工作效率
文/laogui(简书作者)
原文链接:/p/e#
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51220次
排名:千里之外
原创:18篇
转载:95篇
评论:13条
(10)(14)(3)(7)(1)(18)(38)(3)(6)(6)(11)}

我要回帖

更多关于 消费需求与经济增长 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信