【问题标题】:Unable to synchronize threads in Android Studio无法在 Android Studio 中同步线程
【发布时间】:2020-03-18 03:47:46
【问题描述】:

我有一个名为“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(switchFlag);
        switch.setOnCheckedChangeListener(switchListener);
    }catch (NullPointerException e) {e.printStackTrace();}
}

我不知道在哪里使用同步。

【问题讨论】:

  • 让你的布尔变量易变

标签: android thread-safety synchronized


【解决方案1】:

 runThread();

下面

switch.setOnCheckedChangeListener(switchListener);

也替换

switch.setChecked(lightFlag);

switch.setChecked(switchFlag);

【讨论】:

  • 没有运气
  • @user7434651 你能分享整个班级吗?我找不到 lightListener 在哪里。
  • lightFlag vs switchflag 是另一个错字。请更正,然后重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2021-06-27
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多