我以前曾问过,但没有得到任何有用的回复。 我有一个方法。我想通过该方法更新UI。我尝试在UI线程上运行代码,我尝试发布代码(.post [...]),我尝试创建线程但没有任何作用。
以下是我的代码的简化版本:
int x;
for(int i = 0; i < times; i++){
if((i % 2) == 1){
x += (x / (x * 0.5));
} else {
x += (x / (x * 0.25));
}
while((System.currentTimeMillis() - t) < 2000){
// wait
}
runOnUiThread(new Runnable(){
@Override
public void run(){
btn.setText(x.toString());
}
}
} // The for loop won't update the UI until the entire method has finished.
就像我说的,创建一个新的线程/在UI线程/发布上运行没有帮助。 如何在方法运行时更新UI?
由于某种原因,UI将等到方法完成。
答案 0 :(得分:1)
由于某种原因,UI将等到方法完成。
您对setText()
的调用会安排对屏幕的更新,但在您将主应用程序线程的控制权返回给框架之前,该更新不会发生。只要您占用该线程,屏幕就不会更新。
如何在方法运行时更新UI?
如果该方法在主应用程序线程上运行 - 如果上面的代码片段没有崩溃,则必须是这样 - 在运行时无法更新UI。
您可能希望提出一个新的Stack Overflow问题,在那里您可以解释您真正想要做的事情。在original question中,您可以参考动画,但不提供与该动画或runIntensiveMethod()
的实施相关的代码。
答案 1 :(得分:0)
可能应该使用AsyncTask
AsyncTask具有onProgressUpdate(Integer ...)方法,您可以通过调用publishProgress()在doInBackground()期间调用每次迭代,例如每次迭代。
答案 2 :(得分:0)
您可能希望在此处使用AsynkTask
。
它可以是这样的。
class MyTask extends AsycnTask<Void,Integer,Void> {
@Override
protected Void doInBackground(Void... params) {
for(int i = 0; i < times; i++){
if((i % 2) == 1){
x += (x / (x * 0.5));
} else {
x += (x / (x * 0.25));
}
publishProgress(x);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
btn.setText(String.valueOf(progress[0]));
}
}
然后在Activity
new MyTask().execute()
中。有关AsyncTask
here
但是这个方法真的会导致你的UI线程冻结吗?如果你在活动中调用它,它是否只是更新值?