2
BufferedReader hl  = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.lines)));
                while(hl.ready()){
                    showLines.append(hl.readLine()+"\n");
                    showLines.invalidate();
                    Thread.sleep(10);
                }

那是我的代码,但当我告诉它时它不会重绘。它应该在添加到 textview 的每一行之后重绘,但它仍然只在最后重绘?谁能帮帮我,我想不通。

4

2 回答 2

2

那是因为您的 invalidate() 在线程 while 循环中并且正在累积,可以这么说,直到循环结束,并且只有它绘制...

在循环中使用 Thread.sleep() 时我遇到了同样的问题。您可以使用延迟后的方法来绘制每条线,在这种情况下是每秒一条线:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    BufferedReader hl  = new BufferedReader(new InputStreamReader(getResources().openRawResource(R.raw.text))); 
    TextView showLines = (TextView) findViewById(R.id.textView1);
    appendLines(hl, showLines);

}


public void appendLines(final BufferedReader br, final TextView tv){
    Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() {           
         public void run() {                
             try {
                if(br.ready()){                     
                     try {
                        tv.append(br.readLine()+"\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }                     
                     tv.invalidate();                     
                     appendLines(br, tv);             
                     }
            } catch (IOException e) {
                e.printStackTrace();
            } 
         }
         }, 1000); 
     }
于 2011-02-22T00:42:53.653 回答
0

那是我的代码,但当我告诉它时它不会重绘。

invalidate()当你调用它时不会立即发生。invalidate(),就像append()其他任何涉及 UI 的东西一样,将消息放在消息队列中,一旦你允许它就会由主应用程序线程处理。由于您sleep()在主应用程序线程上的循环中浪费用户的时间进行无意义的调用以及执行闪存 I/O,因此主应用程序线程无法处理消息队列中的消息。它会在你的循环结束后处理你的所有invalidate()append()调用,并且你从你所在的任何回调中将控制权返回给 Android。

它应该在添加到 textview 的每一行之后重绘

不,不是。

但它仍然只在最后重绘?

正确的。

简单的解决方案是让您摆脱invalidate()Thread.sleep(10),只需将整个文件内容加载到您TextView的一次调用中。

更好的解决方案是让您通过 读取整个文件AsyncTask,然后将文本附加到TextViewin one call in 中onPostExecute()。如果需要,ProgressDialog在此过程中使用 a 或其他东西让用户保持娱乐。

于 2011-02-22T01:25:42.303 回答