3

TCP 管理のニーズを処理するために、新しいスレッドを作成しました。あらゆる種類のソケット マジックを実行している間、UI スレッドをアクティブに保つためにこれを行いました。私が抱えている問題は、ServerThread で使用される変数 num が handler.post() の run メソッド内で更新されていないように見えることです。一度変更されますが、while(true) ループ内の後続の反復では値が変更されなくなりました。しかし、handler.post() の外側ではちゃんと変化していることに気付きました。num の値を確認するために logcat の log コマンドを含めたので、これが起こっていることがわかります。つまり、UI スレッドでいくつかのことを更新するには、run() メソッド内に変数 num が必要です。

num の宣言方法に問題がある可能性があります。私の質問とは無関係だと思われるもののほとんどをコードに含めていませんでした。これは Android Java スレッドへの私の最初の冒険なので、助けていただければ幸いです。今夜は精神的なエネルギーを使い果たします。

public class MainActivity extends Activity {
    private int num = 0;
    private Handler handler = new Handler();
    //Other declarations


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        //Do bunch of things including starting ServerThread
        //and creating a TCP server socket
        }

    public class ServerThread implements Runnable{
       public void run(){
       // ...
       // Do bunch of stuff including waiting for a client to connect
       try{                         
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
         while(true){ 
           num = in.read();
           Log.e("MainActivity", "A:" +num);       //<-- WORKS FINE
           if(num == -1) //client socket closed
             break;
           handler.post(new Runnable() {
              @Override
              public void run() {
                 Log.e("MainActivity", "B:" +num); //<-- DOES NOT WORK FINE
                 //Do bunch of stuff here with the variable num 
                 //including updating the UI thread
              }
           }
       }catch(Exception e){
              // ...
       }
    }
}
4

0 に答える 0