首页 > 其他 > 详细

第二次迭代—龙峥嵘

时间:2019-12-06 23:50:32      阅读:156      评论:0      收藏:0      [点我收藏+]

主要内容:

1.第二轮迭代的进展

2.在客户端使用http与服务器通信

3.本地轻量级数据库——litepal

4.Android客户端使用广播传递消息

5.第二轮迭代总结

1.第二轮迭代进展

? 第一轮迭代结束时,我们掌握了在Android客户端使用websocket进行全双工通信,建立一个简单客户端和java服务器端(便于自己测试客户端).

? 第二轮迭代结束时,我们使用Material Design风格设计了消息界面,抽屉菜单栏,个人信息界面和聊天界面、注册登陆界面,剩下的未完成的界面只需要沿用这四个基础界面的设计风格,稍加修改就可以完成。在数据存储方面我们为客户端建立了本地数据库,在和服务器通信方面,我们增加了http进行登陆注册验证,在客户端功能实现方面,我们使用Android的service机制使得websocket连接得到长期保活,使用广播即时将websocket收到的聊天信息广播到其他位置,让控件得到响应。

2.使用http通信

? 我们选择http进行注册和登陆验证的优点在于http代价较小,而且不必要在用户未登陆的时候就和服务器建立websocket连接。

? Android发送http请求有很多方式,在TalkTalk中我们使用Okhttp3进代替原生的httpURLConnection。

使用过程

1.添加Okhttp库依赖

在app:build.gradle文件中的dependencies下添加库依赖

implementation 'com.squareup.okhttp3:okhttp:3.4.1'
2.建立处理http请求的类

处理发送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);
    }

主要就是 创建对象->填写表单->新建线程发送请求

3.处理结果
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进程对控件或者界面进行操作。

3.使用数据库——Litepal

LitePal是一款开源的Android数据库框架,采用对象关系映射(ORM)模式,将常用的数据库功能进行封装,可以不用写一行SQL语句就可以完成创建表、增删改查的操作。并且很轻量级,jar包不到100k,几乎零配置。

集成Litepal步骤

1.引入相应的类库

2.创建litepal.xml

3.更换继承的Aplication

1.引入类库

implementation 'org.litepal.android:core:1.3.2'

2.创建litepal.xml

在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标签下则是对象关系模型对应的对象地址

3.更换继承的类库

将对应的Model类继承改为DataSupport,即可方便地进行增删改查操作

4.使用广播传递消息

websocket使用service在后台运行,当websocket收到消息时,我们需要及时更新Activity中的界面,这里我们使用广播来实现,在Activity中定义广播的接收者,Service中收到消息则发出广播

1.动态注册广播

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,然后动态注册,接收到消息时可以在这里接收广播。

2.发送广播

                        Intent intent=new Intent();
                        intent.setAction("org.cheng.WSDemo.chatMsg");
                        intent.putExtra("message",payLoad);
                        sendBroadcast(intent);

5.第二轮迭代总结

? 第二轮迭代完成时我们完成了用户信息,登陆注册,聊天,添加好友群组的基本设计,虽然还没有完全用代码实现,只是实现了其中一部分,但是剩下的部分逻辑已经弄清楚。在下一轮迭代中我们的重点是完成动态功能的设计,以及实现即时聊天的代码。

第二次迭代—龙峥嵘

原文:https://www.cnblogs.com/moonstars2333/p/11999938.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!