1.第二轮迭代的进展
2.在客户端使用http与服务器通信
3.本地轻量级数据库——litepal
4.Android客户端使用广播传递消息
5.第二轮迭代总结
? 第一轮迭代结束时,我们掌握了在Android客户端使用websocket进行全双工通信,建立一个简单客户端和java服务器端(便于自己测试客户端).
? 第二轮迭代结束时,我们使用Material Design风格设计了消息界面,抽屉菜单栏,个人信息界面和聊天界面、注册登陆界面,剩下的未完成的界面只需要沿用这四个基础界面的设计风格,稍加修改就可以完成。在数据存储方面我们为客户端建立了本地数据库,在和服务器通信方面,我们增加了http进行登陆注册验证,在客户端功能实现方面,我们使用Android的service机制使得websocket连接得到长期保活,使用广播即时将websocket收到的聊天信息广播到其他位置,让控件得到响应。
? 我们选择http进行注册和登陆验证的优点在于http代价较小,而且不必要在用户未登陆的时候就和服务器建立websocket连接。
? Android发送http请求有很多方式,在TalkTalk中我们使用Okhttp3进代替原生的httpURLConnection。
使用过程
在app:build.gradle文件中的dependencies下添加库依赖
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
处理发送post请求的函数
public static void postDataWithIdAndPsd(final String address,String userId,String password,final okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("uid",userId);//传递键值对参数
formBody.add("password",password);
Request request = new Request.Builder()//创建Request 对象。
.url(address)
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(callback);
}
主要就是 创建对象->填写表单->新建线程发送请求
HttpUtil.postDataWithIdAndPsd(FakeDataUtil.LoginHttpAddress,account,password,new okhttp3.Callback(){
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData=response.body().string();
try
{
JSONObject jsonObject=new JSONObject(responseData);
System.out.println("成功成功成功"+jsonObject.get("status").toString());
if(jsonObject.get("status").toString().equals("ok"))
{
runOnUiThread(new Runnable() {
@Override
public void run() {
//TODO 登陆成功
Intent intent=new Intent(LoginActivity.this,MessagesActivity.class);
startActivity(intent);
finish();
}
});
}
}catch (JSONException e)
{
//TODO JSON转换错误
}
}
@Override
public void onFailure(Call call,IOException e){
}
});
登陆处理示例,在onResponse中对收到的数据进行处理,使用runOnuiThread控制UI进程对控件或者界面进行操作。
LitePal是一款开源的Android数据库框架,采用对象关系映射(ORM)模式,将常用的数据库功能进行封装,可以不用写一行SQL语句就可以完成创建表、增删改查的操作。并且很轻量级,jar包不到100k,几乎零配置。
集成Litepal步骤
1.引入相应的类库
2.创建litepal.xml
3.更换继承的Aplication
implementation 'org.litepal.android:core:1.3.2'
在main目录下新建文件夹assets,在assets文件夹下建立litepal.xml文件
litepal>
<dbname value="TalkTalk" ></dbname>
<version value="1" ></version>
<list>
<mapping class="org.cheng.wsdemo.bean.UserInfo"></mapping>
....
</list>
</litepal>
其中重要的是version value是数据库本地版本信息,在数据库进行升级时只要增加版本号就可以同步之前的数据,避免数据丢失,在list标签下则是对象关系模型对应的对象地址
将对应的Model类继承改为DataSupport,即可方便地进行增删改查操作
websocket使用service在后台运行,当websocket收到消息时,我们需要及时更新Activity中的界面,这里我们使用广播来实现,在Activity中定义广播的接收者,Service中收到消息则发出广播
private class ChatMessageReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
message=intent.getStringExtra("message");
try
{
JSONObject jsonObject=new JSONObject(message);
if(jsonObject.get("userid").toString().equals(rId)||jsonObject.get("MESSAGETYPE").toString().equals("USERCHAT"))
{
receiveMsg(jsonObject.get("message").toString());
};
}catch (JSONException e)
{
//TODO JSONEXception
}
}
}
private void doRegisterReceiver(){
chatMessageReceiver = new ChatMessageReceiver();
IntentFilter filter=new IntentFilter("org.cheng.WSDemo.chatMsg");
registerReceiver(chatMessageReceiver,filter);
}
创建内部类继承自BroadcastReceiver,然后动态注册,接收到消息时可以在这里接收广播。
Intent intent=new Intent();
intent.setAction("org.cheng.WSDemo.chatMsg");
intent.putExtra("message",payLoad);
sendBroadcast(intent);
? 第二轮迭代完成时我们完成了用户信息,登陆注册,聊天,添加好友群组的基本设计,虽然还没有完全用代码实现,只是实现了其中一部分,但是剩下的部分逻辑已经弄清楚。在下一轮迭代中我们的重点是完成动态功能的设计,以及实现即时聊天的代码。
原文:https://www.cnblogs.com/moonstars2333/p/11999938.html