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スレッドの制御を放棄する必要があります。UIスレッドを占有しないように、進行状況の更新機能を備えたAsyncTaskを使用してこれを行う必要があります。

何かのようなもの:

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 に答える