Android 如何实时更改TextView的内容

Android 如何实时更改TextView的内容,android,textview,real-time,Android,Textview,Real Time,UI非常简单,只有一个按钮login和一个可滚动的文本视图,当我按下按钮login,100行消息将添加到文本视图,但它们同时添加,因为我需要处理添加到文本视图的消息,这将花费一些时间,有时应用程序看起来没有响应。我希望这条消息能逐行添加到文本视图中。我希望文本视图在每个循环中显示添加的消息行。我怎么能意识到这一点?以下是经过简化的主要代码: login.setOnClickListener(new OnClickListener() { public void onClick(View

UI非常简单,只有一个按钮
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();
         }
     }
}