我创建了一个计数器应用程序,它从 0 计数到无穷大,直到使用停止按钮停止循环。该应用程序包含 2 个按钮(开始和停止)和 1 个文本视图。 我的目标是在文本视图中显示从 0 到无穷大(直到循环停止)的值。我正在使用 while 循环。
例如,计数值从 0 开始,因此 while 循环从 0 开始,一直持续到使用停止按钮终止循环为止。我想在文本视图中实时显示值。
public class MainActivity extends AppCompatActivity {
boolean start;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt1=findViewById(R.id.button);
Button bt2=findViewById(R.id.button2);
TextView tv=findViewById(R.id.textView);
Handler h=new Handler(getApplicationContext().getMainLooper());
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
start=true;
new Thread(new Runnable() {
@Override
public void run() {
while(start){
count=count+1;
}
h.post(new Runnable() {
@Override
public void run() {
tv.setText(" "+count);
}
});
}
}).start();
}
});
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
start=false;
}
});
}
}
上面的代码没有在文本视图中实时显示值。有什么问题?另外,我应该为此类任务使用处理程序还是 runonUIThread?
帮助将不胜感激!
你应该使用
runOnUiThread
,因为 while
循环阻塞了 UI 线程。
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(" "+count);
}
});
这里是重构代码以使其正常工作。
public class MainActivity extends AppCompatActivity {
boolean start;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt1=findViewById(R.id.button);
Button bt2=findViewById(R.id.button2);
TextView tv=findViewById(R.id.textView);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
start=true;
new Thread(new Runnable() {
@Override
public void run() {
while(start){
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(" "+count);
}
});
count++;
}
}
}).start();
}
});
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
start=false;
}
});
}
}