android线程监听数据变化

遇到这么一个需求:

app有若干个对象,每个对象分别有多种状态,只要其中某个对象的状态发生变化,就上报给服务器,谁的状态变了,变成什么样了,这些数据都告诉服务器

业务流程图:

设计思路:

1.因为状态是变化时间是未知的,所以开一个子线程一直监听

2.创建两个全局静态的值,用if方法做比对操作,一旦数据变了,就上报服务器

3.数据一旦变了,就赋值给全局的静态值

代码:https://github.com/wrs13634194612/NestStateListener

效果图:

 

主界面:创建子线程,对比方法,界面效果

package com.example.administrator.testz;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    private Thread sThread = null;
    private ToggleButton nest_door, drone, drone_charging, drone_power, drone_remote,
            drone_charge, drone_live, in_live, out_live, drone_connect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initService();
        nest_door = (ToggleButton) findViewById(R.id.nest_door);
        drone = (ToggleButton) findViewById(R.id.drone);
        drone_charging = (ToggleButton) findViewById(R.id.drone_charging);
        drone_power = (ToggleButton) findViewById(R.id.drone_power);
        drone_remote = (ToggleButton) findViewById(R.id.drone_remote);
        drone_charge = (ToggleButton) findViewById(R.id.drone_charge);
        drone_live = (ToggleButton) findViewById(R.id.drone_live);
        in_live = (ToggleButton) findViewById(R.id.in_live);
        out_live = (ToggleButton) findViewById(R.id.out_live);
        drone_connect = (ToggleButton) findViewById(R.id.drone_connect);


        nest_door.setOnCheckedChangeListener(this);
        drone.setOnCheckedChangeListener(this);
        drone_charging.setOnCheckedChangeListener(this);
        drone_power.setOnCheckedChangeListener(this);
        drone_remote.setOnCheckedChangeListener(this);
        drone_charge.setOnCheckedChangeListener(this);
        drone_live.setOnCheckedChangeListener(this);
        in_live.setOnCheckedChangeListener(this);
        out_live.setOnCheckedChangeListener(this);
        drone_connect.setOnCheckedChangeListener(this);


    }

    private void initService() {
        sThread = new Thread(sRunnable);
        sThread.start();

    }

    private Runnable sRunnable = new Runnable() {
        @Override
        public void run() {
            //比对方法
            while (true) {
                compare();
            }
        }
    };

    private void compare() {
        // 比较音源数据  一直比对  只要数据变了  立马赋值 然后下发
        if (DataStruct.SendDeviceData.SYS.nest_door != DataStruct.RcvDeviceData.SYS.nest_door
                || DataStruct.SendDeviceData.SYS.drone != DataStruct.RcvDeviceData.SYS.drone
                || DataStruct.SendDeviceData.SYS.drone_charging != DataStruct.RcvDeviceData.SYS.drone_charging
                || DataStruct.SendDeviceData.SYS.drone_power != DataStruct.RcvDeviceData.SYS.drone_power
                || DataStruct.SendDeviceData.SYS.drone_remote != DataStruct.RcvDeviceData.SYS.drone_remote
                || DataStruct.SendDeviceData.SYS.drone_charge != DataStruct.RcvDeviceData.SYS.drone_charge
                || DataStruct.SendDeviceData.SYS.drone_live != DataStruct.RcvDeviceData.SYS.drone_live
                || DataStruct.SendDeviceData.SYS.in_live != DataStruct.RcvDeviceData.SYS.in_live
                || DataStruct.SendDeviceData.SYS.out_live != DataStruct.RcvDeviceData.SYS.out_live
                || DataStruct.SendDeviceData.SYS.drone_connect != DataStruct.RcvDeviceData.SYS.drone_connect) {
            DataStruct.SendDeviceData.SYS.nest_door = DataStruct.RcvDeviceData.SYS.nest_door;
            DataStruct.SendDeviceData.SYS.drone = DataStruct.RcvDeviceData.SYS.drone;
            DataStruct.SendDeviceData.SYS.drone_charging = DataStruct.RcvDeviceData.SYS.drone_charging;
            DataStruct.SendDeviceData.SYS.drone_power = DataStruct.RcvDeviceData.SYS.drone_power;
            DataStruct.SendDeviceData.SYS.drone_remote = DataStruct.RcvDeviceData.SYS.drone_remote;
            DataStruct.SendDeviceData.SYS.drone_charge = DataStruct.RcvDeviceData.SYS.drone_charge;
            DataStruct.SendDeviceData.SYS.drone_live = DataStruct.RcvDeviceData.SYS.drone_live;
            DataStruct.SendDeviceData.SYS.in_live = DataStruct.RcvDeviceData.SYS.in_live;
            DataStruct.SendDeviceData.SYS.out_live = DataStruct.RcvDeviceData.SYS.out_live;
            DataStruct.SendDeviceData.SYS.drone_connect = DataStruct.RcvDeviceData.SYS.drone_connect;
            // SendDataToDevice(false);  数据变了 发送tcp信息给服务器
            System.out.println("数据变了");
        }
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        switch (buttonView.getId()) {
            case R.id.nest_door:
                System.out.println("机巢门"+isChecked);
                DataStruct.RcvDeviceData.SYS.nest_door = isChecked;
                break;
            case R.id.drone:
                System.out.println("无人机在位状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone = isChecked;
                break;
            case R.id.drone_charging:
                System.out.println("无人机充电状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_charging = isChecked;
                break;
            case R.id.drone_power:
                System.out.println("无人机电源状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_power = isChecked;
                break;
            case R.id.drone_remote:
                System.out.println("无人机遥控器"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_remote = isChecked;
                break;
            case R.id.drone_charge:
                System.out.println("无人机充电器"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_charge = isChecked;
                break;
            case R.id.drone_live:
                System.out.println("无人机推流状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_live = isChecked;
                break;
            case R.id.in_live:
                System.out.println("内部摄像头推流状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.in_live = isChecked;
                break;
            case R.id.out_live:
                System.out.println("外部摄像头推流状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.out_live = isChecked;
                break;
            case R.id.drone_connect:
                System.out.println("无人机连接状态"+isChecked);
                DataStruct.RcvDeviceData.SYS.drone_connect = isChecked;
                break;
            default:
                break;

        }
    }
}

类的对象1:

package com.example.administrator.testz;

/**
 * Created by wrs on 2019/7/26,18:59
 * projectName: Testz
 * packageName: com.example.administrator.testz
 */
public class DataStruct {
    public static Data RcvDeviceData     = new Data();
    public static Data SendDeviceData    = new Data();
}

类的对象2:

package com.example.administrator.testz;

/**
 * Created by wrs on 2019/7/26,19:00
 * projectName: Testz
 * packageName: com.example.administrator.testz
 */
public class Data {
    public DataStruct_System   SYS    = new DataStruct_System();
}

类的对象3:

package com.example.administrator.testz;

/**
 * Created by wrs on 2019/7/26,18:40
 * projectName: Testz
 * packageName: com.example.administrator.testz
 */
public class DataStruct_System {
    public boolean nest_door = false;   //机巢门
    public boolean drone = false;       //无人机在位状态
    public boolean drone_charging = false;         //无人机充电状态
    public boolean drone_power = false;       //无人机电源状态
    public boolean drone_remote = false;       //无人机遥控器
    public boolean drone_charge = false;       //无人机充电器
    public boolean drone_live = false;       //无人机推流状态
    public boolean in_live = false;       //内部摄像头推流状态
    public boolean out_live = false;       //外部摄像头推流状态
    public boolean drone_connect = false;       //无人机连接状态

}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        >

    <ToggleButton
        android:id="@+id/nest_door"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:textOff="机巢门关闭"
        android:textOn="机巢门打开"
        android:checked="false" />

    <ToggleButton
        android:id="@+id/drone"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:textOff="无人机在位状态关闭"
        android:textOn="无人机在位状态打开"
        android:checked="false" />

    <ToggleButton
        android:id="@+id/drone_charging"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:textOff="无人机充电状态关闭"
        android:textOn="无人机充电状态打开"
        android:checked="false" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        >

        <ToggleButton
            android:id="@+id/drone_power"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="无人机电源状态关闭"
            android:textOn="无人机电源状态打开"
            android:checked="false" />

        <ToggleButton
            android:id="@+id/drone_remote"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="无人机遥控器关闭"
            android:textOn="无人机遥控器打开"
            android:checked="false" />

        <ToggleButton
            android:id="@+id/drone_charge"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="无人机充电器关闭"
            android:textOn="无人机充电器打开"
            android:checked="false" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal"
        >

        <ToggleButton
            android:id="@+id/drone_live"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="无人机推流状态关闭"
            android:textOn="无人机推流状态打开"
            android:checked="false" />

        <ToggleButton
            android:id="@+id/in_live"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="内部摄像头推流状态关闭"
            android:textOn="内部摄像头推流状态打开"
            android:checked="false" />

        <ToggleButton
            android:id="@+id/out_live"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:textOff="外部摄像头推流状态关闭"
            android:textOn="外部摄像头推流状态打开"
            android:checked="false" />
    </LinearLayout>

    <ToggleButton
        android:id="@+id/drone_connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="无人机连接状态关闭"
        android:textOn="无人机连接状态打开"
        android:checked="false" />

</LinearLayout>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值