无法在Android Studio中同步线程

问题描述 投票:1回答:1

我有一个名为“ TCP客户端”的后台类,只要在硬件中检测到状态更改,该类就会将布尔值设置为true。并且主活动中的runOnUIThread会检测到此情况并更新UI(它们是切换按钮),以免触发OncheckedChangeListener,我将侦听器设置为null,更改状态,然后将侦听器设置为其原始状态。但是在运行时,OncheckedChangeListener仍在触发。我想这是一个同步问题。

mainActivity.java

public class MainActivity extends AppCompatActivity {
public SwitchButton.OnCheckedChangeListener switchListener;
public com.suke.widget.SwitchButton switch;
public static boolean switchflag=false;
int i;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    setContentView(R.layout.activity_main);

    switch = findViewById(R.id.lightSwitch);
    runThread();

    switchListener = new SwitchButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(SwitchButton view, boolean bChecked) {
                if (bChecked) {
                    Log.d("button", "light is on");
                    connection.tcpClient.sendMessage("li1_1");
                } else {
                    Log.d("Button", "light is off");
                    connection.tcpClient.sendMessage("li1_0");
                }
            }
    };
    switch.setOnCheckedChangeListener(switchListener);
}

    private void runThread() {
    i = 0;
    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            if(connection.tcpClient.getStatusFlag()) {
                                Log.d("main", "got Status");
                                updateUI();
                                connection.tcpClient.setStatusFlag(false);
                            }
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

public void updateUI() {
    try {
        switch.setOnCheckedChangeListener(null);
        switch.setChecked(lightFlag);
        switch.setOnCheckedChangeListener(lightListener);
    }catch (NullPointerException e) {e.printStackTrace();}
}

我没有去哪里使用同步的。

android thread-safety synchronized
1个回答
0
投票

放置

 runThread();

以下

switch.setOnCheckedChangeListener(switchListener);
© www.soinside.com 2019 - 2024. All rights reserved.