在那里放置一个能够更改文本视图的无限循环?



我的第一个Android项目,我的第一个Kotlin项目(Java示例可以帮助我)

问题是这样的: 我有一个文本视图。我可以用代码更改文本。但问题是,似乎我的活动必须结束,以便可以对 gui 进行更改。

myTextView.setText("x = $x") //this works once 
do{  
myTextView.setText("x = $x") //this doesnt work  
println("x = $x") //this works on standart io  
x++  
}while(true)  
do{  
myTextView.setText("x = $x") //this doesnt work until x reaches its limit   
x++  
}while(x<100)  

到目前为止我尝试过: 使用 HandlerThread 启动另一个线程并在那里尝试(不起作用,因为"只有创建视图层次结构的原始线程才能触摸其视图。

首先,我的代码在onCreate中,我意识到将其移动到onResume是一个更好的主意,这样它至少可以在我每次切换到主屏幕并返回时设置文本。但这仍然没有解决方案。

我想到的唯一解决方法是在同一线程上使用 Handler.post() 创建一个循环,但我不确定这是否有效,这似乎是错误的方法,我更喜欢 while 循环,就像它也在标准上与 println() 一起工作一样。也许我需要在循环中调用某种刷新 gui 方法,但我不知道是否存在这样的事情。

目前还不清楚您要在应用程序中执行的操作...如果这是一个计数高达 100 的简单TextView,如果您不希望您的应用程序运行缓慢,则必须使用单独的线程进行计数和等待。

在 android 中,Activity 的 UI 线程本质上处于一个恒定循环中,等待用户输入和对视图的更改发布到队列中,并按顺序处理队列。因此,建议将业务逻辑排除在主线程之外。对它的任何长时间运行的操作都会延迟它完成它想要的工作 - 计算视图外观并每秒刷新屏幕 60 次。

一种方法是使用AsyncTask,这是一种创建新线程以运行某些业务逻辑的方法,它提供了在完成后更新主 UI 线程的方法。

MainActivity中创建一个如下所示的内部类:

private class CounterTask extends AsyncTask<Integer, Integer, Boolean> {
@Override
protected Boolean doInBackground(Integer... integers) {
int count = 100;
for (int i = 0; i < count; i++) {
try {              
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return true;
}
@Override
protected void onProgressUpdate(Integer... status) {
super.onProgressUpdate(status);
int current = status[0];
TextView textView = findViewById(R.id.counter_text_view);
textView.setText(String.valueOf(current));
}
}

然后在活动的onCreate方法中,创建并执行此任务,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Run your counter task
CounterTask task = new CounterTask();
task.execute();
}

最新更新