Java 有没有一个可以改变文本视图的无限循环?
我的第一个Android项目,我的第一个Kotlin项目(Java示例将帮助我) 问题是: 我有一个文本视图。我可以用代码更改文本。但问题是,似乎我的活动必须结束,这样才能对gui进行更改Java 有没有一个可以改变文本视图的无限循环?,java,android,loops,kotlin,Java,Android,Loops,Kotlin,我的第一个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+
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)
myTextView.setText(“x=$x”)//这只工作一次
做{
myTextView.setText(“x=$x”)//这不起作用
println(“x=$x”)//这适用于标准io
x++
}while(true)
做{
myTextView.setText(“x=$x”)//在x达到其极限之前,此操作不起作用
x++
}虽然(x不清楚你在你的应用程序中试图做什么…如果是一个简单的TextView
,计数高达100,你将不得不使用一个单独的线程来进行计数和等待,如果你不想让你的应用程序变慢的话
在android中,活动的UI线程基本上处于一个恒定的循环中,等待用户输入和对视图的更改发布到队列中,然后依次处理。因此,建议将业务逻辑排除在主线程之外。任何长时间运行的操作都会延迟它执行它想要执行的任务——计算v查看外观并每秒刷新屏幕60次
一种方法是使用AsyncTask
,这是一种创建新线程以运行某些业务逻辑的方法,它提供了在完成时更新主UI线程的方法
在main活动中创建一个如下所示的内部类:
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));
}
}
如果它比简单地告诉我如何使用第二个线程来更改textview更简单,而不会得到“只有创建视图层次结构的原始线程才能接触其视图”错误。此外,只要我使用同一个线程,我对Handler.post()的解决方法就会起作用,因此runnable调用Handler.post(此)而不是while(true)在和中,这就像一个while(true)循环。“如果你不想让你的应用程序变得迟钝”这不是我的问题的一部分,我知道循环除了更改文本字段之外什么都不做不是最好的做法。这并没有改变我需要知道如何做的事实,因为它的基本知识。我更新了我的答案,将运行计数器的代码包含在异步任务中,它基本上负责创建ndling一个单独的线程来执行一项任务,并在主线程上运行代码(当它有一个进度更新或完成时)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Run your counter task
CounterTask task = new CounterTask();
task.execute();
}