Java Android:如何在呈现setText()后立即运行回调

Java Android:如何在呈现setText()后立即运行回调,java,android,multithreading,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

我想在
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()
渲染和正在完成的工作之间的延迟——1s的延迟是不可接受的。但是,如果我将延迟更改为0毫秒或1毫秒,那么工作将在文本渲染之前完成

我可以一直输入数字来搜索完美的延迟时间,以便在文本呈现后立即执行代码,但这似乎非常乏味/不精确。有没有更好的方法告诉Android在这之后立即运行回调?谢谢

编辑:以下是我尝试过的两件不起作用的事情。对于加分,如果你能向我解释为什么这些都不起作用,那将非常有帮助

使用
处理程序.post

newhandler(Looper.getMainLooper()).post(r)
也会在文本完成渲染之前运行
r
。我以为
setText
会将渲染代码添加到队列中,所以不应该在渲染代码之后调用
post(r)

使用
查看.发布

this.editor.post(r)
也不起作用,
r
在文本呈现之前仍会被调用。

使用此选项它会使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) {

            }
        });
您可以为
EditText
指定一个

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) {}
}

因此,当您显式设置文本时,应调用此侦听器,在更改文本后,将运行显示文本后需要立即执行的工作。

您可以使用
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);

        }
    });

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

为什么不使用TextWatcher???@hamid\u c不确定,但我认为在UI更新之前运行,不是吗?确切地说,
PostTextChanged(…)
会帮你解决问题。我不知道这一点,但我认为你可以try@Wizard,我刚刚尝试了
后文本更改
。这没有帮助,因为在呈现文本之前仍会调用回调。EdmDroid,谢谢您的回答。不幸的是,
posterextchanged
没有帮助:在绘制任何内容之前仍在调用回调。我只是尝试了一下。不幸的是,这似乎也不起作用。它应该起作用。也许是因为你的代码。你也应该发布你的代码。