项目需要,最近在写Android Studio的tcp通信,同时也是刚开始学java,记录一些遇到的坑
1.使用log输出日志,相比较java的syso多了tag和级别控制,使用更方便
2.活动创立之初要重写oncreate方法
3.一个活动对应一个布局,但是逻辑和图像分离
4.android:id类似于cocos2dx的settag和setname,定义@+id/id_name,使用@id/id_name
5.java创建一个socket的写法,其中ip为string,port为int就可以。创建的同时会发起连接
Socket cilent_socket = new Socket(ip, port);
6.System.out.println可以自动换行……
7. vim 保存提示 readonly option is set (add!to override)的时候,如果确认有root权限就使用:wq!保存
8.获取ArrayList长度使用.size而不是.lenth
9.list是线程不安全的,vector是线程安全的。
10.centos安装java环境、编译和运行java
yum install java-devel
javac
java
11.Android Studio中使用Socket就会闪退,发现socket不能在主线程里创建、连接
12.调试应用失败可以在构建里清除项目后再尝试
13.需要取得对应的权限后方可蓝牙、联网等
14.先在res创建目录,该目录应当从属于R文件,然后在目录创建布局,
setContentView(R.layout.first_layout);
15.创建一个按钮举例
<Button
android:id ="@+id/Light1_turn_on"
android:layout_width ="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"
/>
16.tcp连接后,即使没有实时信息,也要发送心跳包保持连接,心跳包的机制应该是
1.客户端发按心跳周期问服务器 “嘿,我还活着吗”
2.服务器收到之后,告诉客户端 “嗯,你还活着,同时我也还活着”
3.当客户端 “嘿,我还活着吗” “嘿,我还活着吗” “嘿,我还活着吗”……却没有收到回复,此时判定socket连接已经断开
4.客户端主动断开连接(不管此刻的连接状态如何),然后再主动发起连接
17.out.write()是字节输出流的方法,out.print()是字符输出流的方法
18.java线程执行完run部分就会终止线程,可以由此设置退出标志,在while里终止线程
19.Android Studio使用.isConnect判断socket状态时,要先初始化。仅声明不可以,会导致socket为空,返回异常
20.可以使用如下代码段实现java的socket发送,其中发送端需要在代发送的字符串末尾加一个\n,表示一行的结束。或许有其他更好的办法,但是java的输入输出流实在太复杂了,没搞懂
OutputStream cilent_outstream = cilent_socket.getOutputStream();
PrintWriter cilent_sendbuf = new PrintWriter(cilent_outstream);
cilent_sendbuf.write("hello");
cilent_sendbuf.flush();
InputStream cilent_instream = cilent_socket.getInputStream();
BufferedReader cilent_revbuf = new BufferedReader(new InputStreamReader(cilent_instream));
while (true)
{
while (!((rev_string = cilent_revbuf.readLine())==null))
{
SysLog("来自"+cilent_socket.getInetAddress()+"的新信息:"+rev_string);
}
}
21.Android Studio使用Toast消息机制
Toast.makeText(getApplicationContext(), "默认Toast样式",Toast.LENGTH_SHORT).show()
22.Android Studio 多线程使用Thost时候会闪退,跟安卓的消息机制有关系,不深究,前后加Loop即可,Looper.loop会构成死循环,后面的代码不会执行,
Looper.prepare();
Toast.makeText(getApplicationContext(), "服务器已经连接!",Toast.LENGTH_SHORT).show();
Looper.loop();
23…获取布局中的对象
Button connect_button = (Button) findViewById(R.id.Connect);
24.跳转活动
Intent intent = new Intent(SActivity.this, FirstActivity.class);
startActivity(intent);
25.设置活动为主活动
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>