当前位置: 首页 > 科技观察

HarmonyOS分布式聊天室应用_0

时间:2023-03-19 14:55:59 科技观察

了解更多请访问:https://harmonyos.51cto.com,与华为官方共建的鸿蒙技术社区。HarmonyOS分布式仿抖音应用】,这次给大家介绍一款基于Harmony分布式数据服务开发的聊天室应用,模拟现实中的聊天室对话,可以与好友互动,与好友分享自己的故事。伙伴。效果演示项目类别描述主要知识点分布式数据服务官方介绍:分布式数据服务主要实现用户设备中应用数据内容的分布式同步。设备1上的应用A对分布式数据库中的数据进行增删改查后,设备2上的应用A也可以获得数据库的变化。综上所述,多台设备共享一个数据库。首页代码没有特别复杂的逻辑,主要是分布式数据服务的使用,关键地方有注释。importcom.ldd.myapp.bean.ChatDataBean;importcom.ldd.myapp.provider.ChatProvider;importcom.ldd.myapp.util.Tools;importohos.aafwk.ability.AbilitySlice;importohos.aafwk.content.Intent;importohos.agp。components.Button;importohos.agp.components.ListContainer;importohos.agp.components.TextField;importohos.app.Context;importohos.bundle.IBundleManager;importohos.data.distributed.common.*;importohos.data.distributed.user。SingleKvStore;importohos.utils.zson.ZSONArray;importohos.utils.zson.ZSONObject;importjava.util.ArrayList;importjava.util.List;importstaticohos.security.SystemPermission.DISTRIBUTED_DATASYNC;/chatlistprivateListContainerlcList;//聊天数据privatefinalListlistData=newArrayList<>();//聊天数据适配器privateChatProviderchatProvider;//输入框privateTextFieldtfContent;//发送按钮privateButtonbtnSend;//分布式数据库管理器privateKvManagerkvManager;//分布式数据库privateSingleKvStoresingleKvStore;//数据库名privatestaticfinalStringSTORE_NAME="ChatStore";//存储列表数据keyprivatestaticfinalStringKEY_DATA="key_data";//存储头像索引privatestaticfinalStringKEY_PIC_INDEX="key_pic_index";privateintpicIndex=0;@OverridepublicvoidonStart(Intentintent){superonStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);mContext=this;requestPermission();initComponent();initDatabase();}/***请求分布式权限*/privatevoidrequestPermission(){if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){if(canRequestPermission(DISTRIBUTED_DATASYNC)){requestPermissionsFromUser(newString[]{DISTRIBUTED_DATASYNC},0);}}}/***初始化组件*/privatevoidinitComponent(){lcList=(ListContainer)findComponentById(ResourceTable.Id_lc_list);tfContent=(TextField)findComponentById(ResourceTable.Id_tf_content);tfContent.setAdjustInputPanel(true);btnSend=(Button)findComponentById(ResourceTable.Id_btn_send);btnSend.setEnabled(false);//初始化初始化适配器chatProvider=newChatProvider(mContext,listData);lcList.setItemProvider(chatProvider);//输入框内容变化监听tfContent.addTextObserver((text,start,before,count)->{btnSend.setEnabled(text.length()!=0);});//点击发送按钮btnSend.setClickedListener(component->{Stringcontent=tfContent.getText().trim();listData.add(newChatDataBean(Tools.getDeviceId(mContext),picIndex,content));//存入数据库singleKvStore.putString(KEY_DATA,ZSONObject.toZSONString(listData));//清空输入框tfContent.setText("");});}/***初始化分布式数据库*/privatevoidinitDatabase(){//创建分布式数据库管理器kvManager=KvManagerFactory.getInstance().createKvManager(newKvManagerConfig(this));//数据库配置Optionsoptions=newOptions();options.setCreateIfMissing(true)//设置是否创建数据库如果不存在.setEncrypt(false)//设置数据库是否加密setKvStoreType(KvStoreType.SINGLE_VERSION);//数据库类型//创建一个distributeddatabasesingleKvStore=kvManager.getKvStore(options,STORE_NAME);//监听数据库数据变化singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL,newKvStoreObserver(){@OverridepublicvoidonChange(ChangNotificationchangeNotification){ListinsertEntries=changeNotification.getInsertEntries();ListupdateEntries=changeNotification.getUpdateEntries();//第一次保存数据,获取insertEntriesif(insertEntries.size()>0){for(entryentry:insertEntries){if(KEY_DATA.equals(entry.getKey())){//回调为非UI线程,UIgetUITaskDispatcher().syncDispatch(()->{listData.clear();listData需要在UI线程上更新.addAll(ZSONArray.stringToClassList(entry.getValue().getString(),ChatDataBean.class));chatProvider.notifyDataChanged();lcList.scrollTo(listData.size()-1);});}}}elseif(updateEntries.size()>0){for(Entryentry:updateEntries){if(KEY_DATA.equals(entry.getKey())){//回调是非UI线程,需要更新UIgetUITaskDispatcher().syncDispatch(()->{listData.clear();listData.addAll(ZSONArray.stringToClassList(entry.getValue().getString(),ChatDataBean.class));chatProvider.notifyDataChanged();lcList。scrollTo(listData.size()-1);});}}}}});try{picIndex=singleKvStore.getInt(KEY_PIC_INDEX);singleKvStore.putInt(KEY_PIC_INDEX,picIndex+1);}catch(KvStoreExceptione){e.printStackTrace();//没有找到,第一次进入if(e.getKvStoreErrorCode()==KvStoreErrorCode.KEY_NOT_FOUND){picIndex=0;singleKvStore.putInt(KEY_PIC_INDEX,picIndex+1);}}}@OverrideprotectedvoidonStop(){super.onStop();kvManager.closeKvStore(singleKvStore);}}简单案例1,config.json配置"reqPermissions":[{"reason":"多设备协作","name":"ohos.permission.DISTRIBUTED_DATASYNC","usedScene":{"ability":["MainAbility"],"when":"always"}},{"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"},{"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"},{"name":"ohos.permission.GET_BUNDLE_INFO"}]2.布局页面3、MainAbilitySlice代码importohos.aafwk.ability.AbilitySlice;importohos.aafwk.content.Intent;importohos.agp.components.Button;importohos.agp.components.ListContainer;importohos.agp.components.Text;importohos.agp.components.TextField;importohos.bundle.IBundleManager;importohos.data.distributed.common.*;importohos.data.distributed.user.SingleKvStore;importohos.utils.zson.ZSONArray;importjava.util.List;importstaticohos.security.SystemPermission.DISTRIBUTED_DATASYNC;publicclassMainAbilitySliceextendsAbilitySlice{//显示数据privateTexttext;//分布式数据库管理器privateKvManagerkvManager;//分布式数据库KprivateSingleKprivateSingle数据库名privatestaticfinalNAMEStringSTORE";//存储的数据keyprivatestaticfinalStringKEY_COUNT="key_count";@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);requestPermission();initDatabase();initComponent();}/***请求分布式权限*/privatevoidrequestPermission(){if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){if(canRequestPermission(DISTRIBUTED_DATASYNC)){requestPermissionsFromUser(newString[]{DISTRIBUTED}_D);}}}/***初始化分布式数据库*/privatevoidinitDatabase(){//创建分布式数据库管理器kvManager=KvManagerFactory.getInstance().createKvManager(newKvManagerConfig(this));//数据库配置Optionsoptions=newOptions();options.setCreateIfMissing(true)//设置数据库不存在时是否创建setEncrypt(false)//设置数据库是否加密setKvStoreType(KvStoreType.SINGLE_VERSION);//数据库类型//创建分布式数据库singleKvStore=kvManager.getKvStore(options,STORE_NAME);//监听数据库数据的变化updateEntries=changeNotification.getUpdateEntries();//第一次保存数据,获取insertEntriesif(insertEntries.size()>0){for(Entryentry:insertEntries){if(KEY_COUNT.equals(entry.getKey())){//回调为非UI线程,需要更新UIgetUITaskDispatcher().syncDispatch(()->{intcount=entry.getValue().getInt();text.setText("Data:"+count);});}}}elseif(updateEntries.size()>0){for(Entryentry:updateEntries){if(KEY_COUNT.equals(entry.getKey())){//回调是非UI线程,需要在UI线程上更新UIgetUITaskDispatcher().syncDispatch(()->{intcount=entry.getValue().getInt();text.setText("Data:"+count);});}}}}});}/***初始化组件*/privatevoidinitComponent(){text=(Text)findComponentById(ResourceTable.Id_text);Buttonbutton=(Button)findComponentById(ResourceTable.Id_button);//点击事件button.setClickedListener(component->{try{intcount=singleKvStore.getInt(KEY_COUNT);singleKvStore.putInt(KEY_COUNT,count+1);}catch(KvStoreExceptione){e.printStackTrace();//没有找到,第一次进入if(e.getKvStoreErrorCode()==KvStoreErrorCode.KEY_NOT_FOUND){intcount=0;singleKvStore.putInt(KEY_COUNT,count+1);}}});}}注释比较详细,主要注意2点:获取数据时添加一个trycatch块,处理找不到key的情况是为了让你快速掌握分布式数据服务:在具有相同应用程序的多个设备之间使用相同的数据库。更多信息请访问:Harmonyos.51cto.com,与华为官方共同建立的鸿蒙技术社区