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
没有帮助:在绘制任何内容之前仍在调用回调。我只是尝试了一下。不幸的是,这似乎也不起作用。它应该起作用。也许是因为你的代码。你也应该发布你的代码。