0

UI非常简单,只有一个按钮login和一个可滚动的TextView,当我按下按钮时login,100行消息将添加到TextView,但它们是同时添加的,因为我需要处理这些消息这将添加到 TextView,这将花费一些时间,有时应用程序看起来没有响应。我希望消息可以逐行添加到 TextView 中。IOW 我希望 TextView 在每个循环中显示添加的消息行。我怎么能意识到这一点?这是已简化的主要代码:

login.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        for(int i = 0; i < 100; i++) {
            mTextView.append("test\n");
        }
    }
}
4

4 回答 4

0

任何改变 UI 元素的东西都必须在 UI 线程上运行。由于您正在运行长时间运行的循环,因此您的应用程序会冻结。您应该更改设计并避免在循环中更新 UI,或者您可以使用运行 abackground thread并将文本附加到StringBuilder循环结束时,将 StringBuilder 文本附加到 mtextView。

同样,如果您的 StringBuilder 包含非常大的文本,将其更新到 UI 可能会再次冻结它。

于 2012-04-07T14:33:44.387 回答
0
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();
         }
     }
}
于 2012-04-07T14:37:33.607 回答
0
login.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
       mTextView.setText(""); 
       for(int i = 0; i < 100; i++) {
            mTextView.setText(mTextView.getText()+"test\n");
        }
    }
}

试试这个代码它应该可以工作

于 2012-04-07T14:19:36.820 回答
0

用这个:

    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; 
        }  
        });  
}
      }
    }
于 2012-04-07T14:21:50.420 回答