原创

安卓实战03---温湿度、插座和门禁


1 实现“控制插座开关”的功能

1.1 查看文件:ABSDK接口

6控制插座(请在登录后使用)
名称ABRet sockCtrl(String soDevName, String status)
参数soDevName: 插座名称、status:插座状态(0:关闭 1:打开)
返回值ABRet: code String 处理结果(00000成功,00000以外失败)、msg

1.2 根据接口文件编写程序

  1. 获取插座的控制权限(已经完成)
  2. 获取插座当前的“开-关”状态
  3. 新创建一个类ConrolSocketStatusTask,继承AsyncTask
  4. 重写doInBackground()、onPostExecute()方法
  5. 将得到的状态对立的状态,传入sockCtrl()方法
  6. 实例化新建的ConrolSocketStatusTask类
  7. 执行!!!
public class SocketActivity extends AppCompatActivity {
    private TextView textViewSocket_St;    // 显示插座当前状态
    private String SocketStatus;           // 插座当前状态

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

    private void findView() {
        textViewSocket_St = (TextView) findViewById(R.id.textViewSocket_St);
    }

    public void onClickSocket(View view) {
        SocketStatusTask socketStatusTask = new SocketStatusTask();
        socketStatusTask.execute();
    }

    // 1.获取插座的控制权限(已经完成)
    class SocketStatusTask extends AsyncTask<Void, Void, ABRet> {

        @Override
        protected ABRet doInBackground(Void... Voids) {
            ABRet abRet = ABSDK.getInstance().getSockStatus("s1");
            return abRet;
        }

        @Override
        protected void onPostExecute(ABRet abRet) {
            super.onPostExecute(abRet);
			
            if (abRet.getCode().equals("00000")) {
                Toast.makeText(SocketActivity.this, "插座权限获取成功", Toast.LENGTH_SHORT).show();
		// 2.获取插座当前的“开-关”状态
                SocketStatus = abRet.getDicDatas().get("status").toString();
                textViewSocket_St.setText(SocketStatus);
                // 6.实例化
                ConrolSocketStatusTask conrolSocketStatusTask = new ConrolSocketStatusTask(SocketStatus);
		// 7.执行!!!
                conrolSocketStatusTask.execute();
            } else {
                Toast.makeText(SocketActivity.this, "插座权限获取失败" + abRet.getCode(),
                        Toast.LENGTH_SHORT).show();
            }
        }
    }
	
    // 3.新创建一个类ConrolSocketStatusTask,继承AsyncTask
    class ConrolSocketStatusTask extends AsyncTask<String, Void, ABRet> {
        private String SocketStatus1;

        public ConrolSocketStatusTask(String SocketStatus) {
            SocketStatus1 = SocketStatus;
        }

	// 4.重写doInBackground()、onPostExecute()方法
        @Override
        protected ABRet doInBackground(String... Voids) {
	    // 5.将得到的状态对立的状态,传入sockCtrl()方法
            if (SocketStatus1.equals("0")) {
                SocketStatus1 = "1";
            } else {
                SocketStatus1 = "0";
            }
            ABRet abRet = ABSDK.getInstance().sockCtrl("s1", SocketStatus1);
            return abRet;
        }

        @Override
        protected void onPostExecute(ABRet abRet) {
            super.onPostExecute(abRet);

            if (abRet.getCode().equals("00000")) {
                Toast.makeText(SocketActivity.this, "插座状态“更改”为:" + SocketStatus1, Toast.LENGTH_SHORT).show();
                textViewSocket_St.setText(SocketStatus1);
            } else {
                Toast.makeText(SocketActivity.this, "插座状态“更改”失败!!!!" + abRet.getCode(), Toast.LENGTH_SHORT).show();
            }
        }
    }
}

1.3 可能出现的“逻辑”问题:20000请求超时

出现这个问题的原因很大的可能性,是因为你将后台程序写在了前端(例:将本应该在doInBackground()中的程序错写在onPostExecute()中),使前端程序已经开始运行显示了,后台数据还没刷新完,导致请求超时!

【ps】由于温湿度、门禁、插座编写思路类似,下面只提供程序流程图,不再作过多的解释说明。

2 实现“温湿度显示”的功能

2.1 查看文件:ABSDK接口

14取得温湿度情报(请在登录后使用)
名称ABRet getThStatus(String thDevName)
参数thDevName: 温湿度名称
返回值ABRet: code String、dicdatas Map:"temperature" String -温度, "humidity" String -湿度

2.2 根据接口文件编写程序

avatar

public class TempAndHumidityActivity extends AppCompatActivity {
    private TextView textViewTemp;
    private TextView textViewHumidity;

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

        findView();
        THStatusTask thStatusTask = new THStatusTask();
        thStatusTask.execute();
    }

    private void findView(){
        textViewTemp = (TextView) findViewById(R.id.textViewTemp);
        textViewHumidity = (TextView) findViewById(R.id.textViewHumidity);
    }

    class THStatusTask extends AsyncTask<Void, Void, ABRet> {
        @Override
        protected ABRet doInBackground(Void... Voids) {
            ABRet abRet = ABSDK.getInstance().getThStatus("TH1");
            return abRet;
        }

        @Override
        protected void onPostExecute(ABRet abRet) {
            super.onPostExecute(abRet);

            if (abRet.getCode().equals("00000")){
                Toast.makeText(TempAndHumidityActivity.this,"温湿度获取成功",Toast.LENGTH_SHORT).show();
                String temp = abRet.getDicDatas().get("temperature").toString();
                String humidity = abRet.getDicDatas().get("humidity").toString();
                textViewTemp.setText(temp);
                textViewHumidity.setText(humidity);

            }else{
                Toast.makeText(TempAndHumidityActivity.this,"温湿度获取失败"+abRet.getCode(),Toast.LENGTH_SHORT).show();
            }
        }
    }
}

3 实现“门磁状态显示”的功能

3.1 查看文件:ABSDK接口

13取得门磁状态(请在登录后使用)
名称ABRet getDoorStatus(String doorDevName)
参数doorDevName: 门磁名称
返回值ABRet: code String、dicdatas Map:status String 门磁状态(0:关闭 1:开启)

3.2 根据接口文件编写程序

avatar

public class DoorActivity extends AppCompatActivity {
    private TextView textViewDoor;  

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

    private void findView() {
        textViewDoor = (TextView) findViewById(R.id.textViewDoor);
        DoorStatusTask doorStatusTask = new DoorStatusTask();
        doorStatusTask.execute();
    }

    class DoorStatusTask extends AsyncTask<Void, Void, ABRet> {
        @Override
        protected ABRet doInBackground(Void... Voids) {
            ABRet abRet = ABSDK.getInstance().getDoorStatus("door");
            return abRet;
        }

        @Override
        protected void onPostExecute(ABRet abRet) {
            super.onPostExecute(abRet);
            if (abRet.getCode().equals("00000")){
                String door_status = abRet.getDicDatas().get("status").toString();
                textViewDoor.setText(door_status);
                Toast.makeText(DoorActivity.this,"门禁状态获取成功", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(DoorActivity.this,"门禁状态获取失败" + abRet.getCode(),
                        Toast.LENGTH_SHORT).show();
            }
        }
    }
}

【ps】我们现在设计的页面和编写的后台都是测试版本,考虑的问题比较少,只是为了看现象十分简单,等到后期设计的时候,我们会考虑到各种各样的问题以及UI设计的合理性等等。

Java
Android
  • 作者:李延松(联系作者)
  • 发表时间:2021-05-21 15:05
  • 版本声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码

评论

留言