3

我创建了一个新线程来处理我的 TCP 管理需求。我这样做是为了在 UI 线程执行各种套接字魔术时保持其处于活动状态。我遇到的问题是 ServerThread 中使用的变量 num 似乎没有在 handler.post() 的 run 方法中更新。它改变了一次,但我的 while(true) 循环中的后续迭代不再改变它的值。但是,在 handler.post() 之外,我注意到它正在正确更改。为了查看 num 的值,我为 logcat 包含了一个日志命令,这就是为什么我知道这是正在发生的事情。问题是,我需要 run() 方法中的变量 num 来更新 UI 线程中的一些内容。

我声明 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