Android 如何实时更改TextView的内容
UI非常简单,只有一个按钮Android 如何实时更改TextView的内容,android,textview,real-time,Android,Textview,Real Time,UI非常简单,只有一个按钮login和一个可滚动的文本视图,当我按下按钮login,100行消息将添加到文本视图,但它们同时添加,因为我需要处理添加到文本视图的消息,这将花费一些时间,有时应用程序看起来没有响应。我希望这条消息能逐行添加到文本视图中。我希望文本视图在每个循环中显示添加的消息行。我怎么能意识到这一点?以下是经过简化的主要代码: login.setOnClickListener(new OnClickListener() { public void onClick(View
login
和一个可滚动的文本视图,当我按下按钮login
,100行消息将添加到文本视图,但它们同时添加,因为我需要处理添加到文本视图的消息,这将花费一些时间,有时应用程序看起来没有响应。我希望这条消息能逐行添加到文本视图中。我希望文本视图在每个循环中显示添加的消息行。我怎么能意识到这一点?以下是经过简化的主要代码:
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
for(int i = 0; i < 100; i++) {
mTextView.append("test\n");
}
}
}
login.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
对于(int i=0;i<100;i++){
mTextView.append(“测试\n”);
}
}
}
login.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
mTextView.setText(“”);
对于(int i=0;i<100;i++){
mTextView.setText(mTextView.getText()+“test\n”);
}
}
}
请尝试此代码,它应该可以工作使用此代码:
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mTextView.setText("");
if (!isStopped) {
Acitivut.this.runOnUiThread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 100; i++) {
mTextView.append("test\n");
}
isStopped=true;
}
});
}
}
}
login.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
mTextView.setText(“”);
如果(!isStopped){
Acitivut.this.rununuithread(新的Runnable(){
@凌驾
public void run(){
对于(int i=0;i<100;i++){
mTextView.append(“测试\n”);
}
isStopped=true;
}
});
}
}
}
任何更改UI元素的操作都必须在UI线程上运行。由于您正在运行长时间运行的循环,您的应用程序将冻结。您应该更改设计并避免在循环中更新UI,或者您可以使用运行后台线程
并将文本附加到StringBuilder
中,循环结束后,将StringBuilder文本附加到mtextView
同样,如果您的StringBuilder包含非常大的文本,将其更新到UI可能会再次冻结它。login.setOnClickListener(新OnClickListener(){
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
i=0;
Thread thread=new Thread(new SleepThread());
thread.start();
}
}
private class SleepThread implements Runnable
{
public void run()
{
sleep(10);
handler.sendEmptyMessage();
}
}
Handler handler=new Handler()
{
public void handleMessage(Message msg)
{
mTextView.append("test\n");
i++;
if(i<100)
{
Thread thread=new Thread(new SleepThread());
thread.start();
}
}
}
公共void onClick(视图v){
i=0;
线程线程=新线程(newsleepthread());
thread.start();
}
}
私有类SleepThread实现可运行
{
公开募捐
{
睡眠(10);
handler.sendEmptyMessage();
}
}
Handler=newhandler()
{
公共无效handleMessage(消息消息消息)
{
mTextView.append(“测试\n”);
i++;
if(ithx,但是我应该在哪里定义变量isStopped?我试图在if(!isStopped){
之前添加行boolean isStopped=false
,但是isStopped
无法在new Runnable(){}中检查
因为它在另一个类中。如果工作正常,则将其保留。我已添加了此变量bez,如果用户同时单击两次on按钮,则阻止它。@MarkZar:请对此情况使用on逻辑
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
i=0;
Thread thread=new Thread(new SleepThread());
thread.start();
}
}
private class SleepThread implements Runnable
{
public void run()
{
sleep(10);
handler.sendEmptyMessage();
}
}
Handler handler=new Handler()
{
public void handleMessage(Message msg)
{
mTextView.append("test\n");
i++;
if(i<100)
{
Thread thread=new Thread(new SleepThread());
thread.start();
}
}
}