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){
// ...
}
}
}