2

我遇到了一个问题,按下按钮我尝试读取有数据进入的 DataInputstream 并显示数据。

我正在使用 while 循环来读取数据。但是 Textview 的动态更新不会发生。

TextView datatextview = (TextView)findViewById(R.id.data); 

DataInputStream Din = new DataInputStream(socket.getInputStream());
Button getData= (Button)findViewById(R.id.getdata);
getData.setOnClickListener(new OnClickListener() {
    public void onClick(View v) { 
    //.......stuff .......
    try{
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int bytesRead = -1;
    String message1 = "";
    while (true) {
        message1 = "";
        data = Din.readLine();
        bytesRead = (reading).length();
        if (bytesRead != -1) {
            Log.v(TAG,"data"+data); //I'm getting the data correctly
            //But not able to update it in the TextView :(
            datatextview.setText(data);  //doesnt work
        }
    }
4

2 回答 2

4

您必须退出您的方法并放弃对 UI 线程的控制才能更新您的视图。您可能应该使用AsyncTask及其进度更新功能来执行此操作,这样您就不会占用 UI 线程。

就像是:

public class MyTask extends AsyncTask<Void, String, Void> {
  private final TextView progress;

  public MyTask(TextView progress) {
    this.progress = progress;
  }

  @Override
  protected void onPreExecute() {
    progress.setText("Starting...");
  }

  @Override
  protected Void doInBackground(Void... unused) {
    ... your buffer code, including publishProgress(data); in your while loop ...
  }

  @Override    
  protected void onProgressUpdate(String... data) {
    progress.setText(data[0]);
    progress.invalidate(); // not sure if this is necessary or not
  }

  @Override
  protected void onPostExecute(Void unused) {
    progress.setText("Finished!");
  }
}

然后您可以使用以下命令创建和执行您的 AsyncTask:

new MyTask(datatextview).execute();

编辑@Override-如果您的方法签名不正确,请确保使用它有助于提醒您。

于 2011-03-16T15:37:50.680 回答
0

马修就在这里,但要详细说明...

如果你是从一个线程中执行此操作,那么你可能会卡住循环太快,UI 永远没有机会用你的新值重绘。如果您想从线程调用中强制重绘 UI View.invalidate()

如果您再次从主线程(您绝对应该重新考虑)执行此操作,那么您将陷入循环并且 UI 无法重绘......您希望所有人都View.postInvalidate()强制 UI 重绘。

于 2011-03-16T15:41:45.263 回答