在Handler中设置Textler中的文本性能不佳

时间:2013-01-28 06:55:19

标签: android performance datepicker textview

由于Android不支持显示日期,我在布局中添加了TextView。

在DatePicker上我放了一个onDateChangedListener。当日期改变时,我确定星期几,然后通过处理程序设置它以确保它在UI线程上完成:

// this is being called when the date changes on the DatePicker
public void onDateChanged(DatePicker view, final int year,
                final int monthOfYear, final int dayOfMonth) {
    String dayOfTheWeek = null;

    // some code here to set the 'dayOfTheWeek' string

    h.sendMessage(h.obtainMessage(0, dayOfTheWeek));
}

final Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        dayOfWeekTextView.setText((String)msg.obj);
    }
};

我的问题:当我滚动窗口小部件中的日子(Android 4.0 U我)时,它并不顺利!我检查问题是什么,这不是我确定String应该是什么的方式,它实际上是Handler中的setText()。评论那部分uit,一切都很好。同样在那里设置硬编码文本(dayOfWeekTextView.setText("SOMETHING');)会产生同样的问题。它抖动了DatePicker

setText()真的那么大吗?奇妙清单显示了星期几,并且运行平稳,但我无法知道他们是如何做到的。

我只在HTC One X上测试了它。 有人有想法吗?

  

编辑:

     

我发现了为什么它在Wunderlist中很顺利!我使用的是DialogFragment。您可以在对话框上设置标题,这是Wunderlist使用的而不是TextView。所以我将使用它(并且看起来也更好;))

     

所以当做'getDialog()。setTitle(dayOfWeek)时,没有问题。问题仍然存在:为什么setText在UI线程上变得缓慢......?

4 个答案:

答案 0 :(得分:3)

<强>解 一个非常性感和肮脏的解决方案是创建7 TextView并切换其中一个的可见性。直到一周延长到8天的那一天,这种方法应该有更好的表现。


另外,这可能是由于textview的布局参数所致。您可能想给它一些额外的空间,换句话说,setText不应该产生布局。我不确定是否会发生这种情况。

答案 1 :(得分:3)

糟糕的表现可能是重新计算布局的结果。如果textview宽度是wrap-content,则每次文本更改时,布局都会更新。 尝试修复textview的宽度。

答案 2 :(得分:0)

尝试以下格式:

t1.setText(""+string_name);

我使用这种格式在TextView和EditText中设置Text

答案 3 :(得分:0)

我尝试使用您所述的类似“处理程序”方法实现相同的方法并将其证明 工作得非常好,也很敏感。

试试这段代码:

final DatePicker dp = (DatePicker)findViewById(R.id.datePicker1);

        dp.init(2012, 6, 17, new OnDateChangedListener() {

            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear,
                    final int dayOfMonth) {

                handler.post(new Runnable() {

                    @Override
                    public void run() {

                        TextView tv = (TextView) findViewById(R.id.textView1);

                        // some code here to set the 'dayOfTheWeek' string


                        tv.setText(Integer.toString(dayOfTheWeek));   // (if you want to set a number of day instead of its name)

                                           //  OR

                        tv.setText(dayOfTheWeek);   

                    }
                });

            }
        });

这里的问题是使用Wrapper类 Integer 将int值转换为String。如果您通过“ plane int ”,则会抛出资源未找到异常。