Android:如何在渲染setText()之后立即运行回调

时间:2017-06-20 04:45:39

标签: java android multithreading

我想在EditText中显示一些文字,并在显示文字后立即开展工作。我的onCreate()方法中包含以下代码:

this.editor.setText(text, TextView.BufferType.EDITABLE);
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        // Work that needs to be done right after the text is displayed
    }
}, 1000);

这样可行,但我想尽量减少setText()渲染和正在完成的工作之间的延迟 - 1秒延迟是不可接受的。但是,如果我将延迟更改为0ms或1ms,则在文本呈现之前完成工作。

我可以继续输入数字来搜索在文本呈现后执行我的代码的完美延迟时间,但这看起来非常繁琐/不精确。有没有更好的方法告诉Android在发生这种情况后立即运行回调?感谢。

编辑:以下是我尝试过的两件不起作用的事情。对于奖励积分,如果您能向我解释为什么这些不起作用将会非常有用。

使用Handler.post

在文本完成渲染之前,

new Handler(Looper.getMainLooper()).post(r)也会运行r。我认为setText会将渲染代码添加到队列中,因此在渲染代码之后添加post(r)之后不应该调用r吗?

使用View.post

this.editor.post(r)也无法正常工作,在呈现文字之前仍会调用r

4 个答案:

答案 0 :(得分:1)

使用它会hlp

mSongNameTextView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

答案 1 :(得分:1)

您可以为EditText分配TextWatcher

TextWatcher基本上是一个侦听器,用于侦听EditText中文本(之前,期间和之后)的更改。

可以按如下方式实施:

EditText et;
et.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {
        // Work that needs to be done right after the text is displayed
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
}

因此,当您显式设置文本时,应调用此侦听器,并在更改文本后,将运行// Work that needs to be done right after the text is displayed代码。

答案 2 :(得分:0)

您可以使用ViewTreeObserver,如下所示:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // do your work here. This call back will be called after view is rendered.
            yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // or below API 16: yourView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        }
    });

答案 3 :(得分:0)

我最初想延迟工作,因为它是CPU密集型的。我意识到解决方案是为工作启动一个新线程,而不是将其发布到UI线程。