以上是比较重要的UI控件,大家了解一下,其他的一些属性我就不多说了,你们可以自己尝试修改一下参数,就会发现具体的对应的作用是什么了。
我们的ui已经做好了,现在就去写主活动类的逻辑代码!!!
我主要说说主要逻辑吧。
首先,当然是要把我们前面编写的界面都映射到我们的主活动,setContentView(R.layout.activity_main);//该activity映射的xml界面是activity_main.xml
,就是这一句,然后,开启严苛模式,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。
接下来就是,初始化view组件 ` initView();//初始化显示的功能控件
最后对某些组件设置监听事件,以及编写对应的函数
我们想要APP和单片机进行tcp通信,要怎么实现呢?
建立socket连接实现tcp/ip协议----这个就是我们的实现方式。
那应该怎么做?
1.创建Socket(安卓作为客户端,所以是client,单片机作为server端)。
2.打开连接到Socket的输入/输出流。
3.按照协议对Socket进行读/写操作。
4.关闭输入输出流、关闭Socket。
也许说了你们可能还是不太懂,这个用代码怎么实现啊?
我先说明一下,java socket的实现和安卓平台socket的实现有一点点的区别,*在安卓里面,涉及到网络连接等耗时操作时,不能将其放在UI主线程中,需要添加子线程,在子线程进行网络连接,这就涉及到安卓线程间的通信了,用Handle来实现。这里的子线程也就是 mThreadClient。
下面直接看我的代码----MainActivity.java
package com.example.smarthome;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
/**
- 建立socket连接实现tcp/ip协议的方式:
*1.创建Socket(安卓作为客户端,所以是client,单片机作为server端)
*2.打开连接到Socket的输入/输出流
*3.按照协议对Socket进行读/写操作
*4.关闭输入输出流、关闭Socket
*/
public class MainActivity extends AppCompatActivity {
private Button startButton;//连接按钮
private EditText IPText;//ip地址输入
private boolean isConnecting=false;//判断是否连接
private Thread mThreadClient=null;//子线程
private Socket mSocketClient=null;//socket实现tcp、ip协议,实现tcp server和tcp client的连接
private static PrintWriter mPrintWriterClient=null;//PrintWriter是java中很常见的一个类,该类可用来创建一个文件并向文本文件写入数据
private String res=“”;//接收的数据
private TextView warning_show, temp, mq;//警告语 温湿度 气体浓度
private String []send_order={“1\n”,“2\n”,“3\n”,“4\n”};//发送的指令 1开启通风 2 关闭通风 3开启抽湿 4关闭抽湿
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//该activity映射的xml界面是activity_main.xml
strictMode();//严苛模式
initView();//初始化显示的功能组件
}
/**
-
严苛模式
-
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,
-
以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,
-
而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,
-
我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。
*/
private void strictMode(){
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build()
);
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
/**
- layout组件初始化
*/
private void initView(){
warning_show = findViewById(R.id.tv1);//警告语显示
temp = findViewById(R.id.temp_text);//温湿度显示
mq = findViewById(R.id.mq_text);//气体浓度显示
IPText= findViewById(R.id.IPText);//ip地址和端口号
IPText.setText(“192.168.1.127:8080”);//把ip地址和端口号设一个默认值,这个要改成你自己设置的
startButton= findViewById(R.id.StartConnect);//连接按钮
//连接事件 其实就是建立socket连接
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isConnecting)
{
isConnecting=false;
if(mSocketClient!=null)
{
try{
mSocketClient.close();
mSocketClient = null;
if (mPrintWriterClient!=null){
mPrintWriterClient.close();
mPrintWriterClient = null;
}
mThreadClient.interrupt();
startButton.setText(“开始连接”);
IPText.setEnabled(true);//可以输入ip和端口号
warning_show.setText(“断开连接\n”);
} catch (IOException e) {
e.printStackTrace();
}
}