APP聊天项目介绍

项目结构说明

res/layout目录:存放布局相关的 XML 文件,用于定义界面的外观,包含activity_main.xml(主界面布局)和message_item.xml(聊天消息项布局)。

res/drawable目录:存放一些自定义的图形资源相关的 XML 文件以及图片资源(如果有),用于界面样式设置,如背景、按钮样式等,包含edittext_rounded_bg.xmlbutton_send_bg.xmlleft_message_bg.xmlright_message_bg.xml等文件(代码中只是简单示意,这部分并没有整理很清楚,接下来打算可根据实际需求替换和完善图片资源等)。

java(对应项目包名的目录下):存放业务逻辑代码等,包含如MainActivity.java(主 Activity 类,处理界面交互、消息发送接收展示等核心逻辑)、ChatAdapter.java(聊天消息列表适配器类,用于将消息数据绑定到RecyclerView的每一项上展示)、Message.java(消息实体类,表示一条聊天消息)、DBHelper.java(数据库帮助类,用于管理 SQLite 数据库的创建、操作等)。

代码展示

布局文件代码

activity_main.xml(存放在res/layout目录下)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#EFEFF4"tools:context=".MainActivity"><!-- 聊天消息列表RecyclerView --><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView_chat"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/layout_chat_input"android:clipToPadding="false"android:padding="8dp"android:scrollbars="vertical" /><!-- 输入框及发送按钮所在的底部布局 --><LinearLayoutandroid:id="@+id/layout_chat_input"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@android:color/white"android:orientation="horizontal"android:padding="8dp"><!-- 表情按钮(这里先简单占位,可后续添加点击事件及表情选择功能等) --><ImageButtonandroid:id="@+id/button_emoji"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_emoji"android:contentDescription="表情" /><!-- 输入文本的EditText,设置了一些样式属性 --><EditTextandroid:id="@+id/editText_message"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/edittext_rounded_bg"android:hint="输入消息"android:padding="8dp"android:textColor="#000"android:textColorHint="#999" /><!-- 发送按钮 --><Buttonandroid:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送"android:textColor="@android:color/white"android:background="@drawable/button_send_bg" /></LinearLayout></RelativeLayout>

message_item.xml(存放在res/layout目录下)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="4dp"><!-- 显示发送者头像(这里先简单用一个ImageView占位,实际可根据用户信息加载对应的头像资源) --><ImageViewandroid:id="@+id/imageView_sender_avatar"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/default_avatar"android:scaleType="centerCrop" /><!-- 用于包裹消息内容的布局,根据消息是自己发送还是别人发送设置不同的对齐方式 --><LinearLayoutandroid:id="@+id/layout_message_content"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"android:padding="8dp"><!-- 显示发送者昵称(实际中可根据用户信息动态设置) --><TextViewandroid:id="@+id/textView_sender_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送者昵称"android:textColor="#000"android:textSize="14sp" /><!-- 根据消息类型展示不同内容,这里先以文本消息为例,用TextView展示 --><TextViewandroid:id="@+id/textView_message_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="消息内容"android:textColor="#333"android:textSize="16sp"android:layout_marginTop="4dp" /></LinearLayout></LinearLayout>

res/drawable目录下样式资源相关 XML 文件代码

edittext_rounded_bg.xml(存放在res/drawable目录下)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="@android:color/white" /><corners android:radius="16dp" /></shape>

button_send_bg.xml(存放在res/drawable目录下)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape android:shape="rectangle"><solid android:color="#007AFF" /><corners android:radius="16dp" /></shape></item><item><shape android:shape="rectangle"><solid android:color="#0085FF" /><corners android:radius="16dp" /></shape></item></selector>

left_message_bg.xml(存放在res/drawable目录下)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#DCF8C6" /><corners android:topLeftRadius="16dp"android:bottomLeftRadius="16dp"android:bottomRightRadius="16dp" /></shape>

right_message_bg.xml(存放在res/drawable目录下,样式与left_message_bg.xml类似,可做区分,这里简单示意)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#87CEEB" /><corners android:topRightRadius="16dp"android:bottomLeftRadius="16dp"android:bottomRightRadius="16dp" /></shape>

业务逻辑代码

import java.util.Date;public class Message {private String sender;private String content;private String messageType;private long timestamp; // 添加时间戳属性,记录消息发送时间public Message(String sender, String content, String messageType) {this(sender, content, messageType, new Date().getTime()); // 默认使用当前时间作为时间戳}public Message(String sender, String content, String messageType, long timestamp) {this.sender = sender;this.content = content;this.messageType = messageType;this.timestamp = timestamp;}public String getSender() {return sender;}public String getContent() {return content;}public String getMessageType() {return messageType;}public long getTimestamp() {return timestamp;}
}

ChatAdapter.java(存放在 java 对应包名目录下)

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import java.util.ArrayList;
import java.util.List;public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ChatViewHolder> {private List<Message> messageList;public ChatAdapter() {messageList = new ArrayList<>();}public void addMessage(Message message) {messageList.add(message);notifyItemInserted(messageList.size() - 1);}@NonNull@Overridepublic ChatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 使用新的消息项布局文件来加载视图View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_item, parent, false);return new ChatViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ChatViewHolder holder, int position) {Message message = messageList.get(position);holder.bind(message);}@Overridepublic int getItemCount() {return messageList.size();}class ChatViewHolder extends RecyclerView.ViewHolder {private ImageView imageViewSenderAvatar;private TextView textViewSenderName;private TextView textViewMessageContent;public ChatViewHolder(@NonNull View itemView) {super(itemView);imageViewSenderAvatar = itemView.findViewById(R.id.imageView_sender_avatar);textViewSenderName = itemView.findViewById(R.id.textView_sender_name);textViewMessageContent = itemView.findViewById(R.id.textView_message_content);}public void bind(Message message) {if ("text".equals(message.getMessageType())) {// 根据消息发送者等信息设置对应的显示内容和样式(这里简单示例,可根据实际完善)textViewSenderName.setText(message.getSender());textViewMessageContent.setText(message.getContent());if (message.getSender().equals("自己的用户名")) {// 假设自己发送的消息居右对齐等样式设置(这里只是简单示意,可通过布局属性等详细设置样式)// 比如设置背景颜色、文本对齐方式等与对方消息区分开textViewMessageContent.setBackgroundResource(R.drawable.right_message_bg);} else {textViewMessageContent.setBackgroundResource(R.drawable.left_message_bg);}}// 后续添加对图片消息等其他类型消息的展示逻辑}}
}

DBHelper.java(存放在 java 对应包名目录下)

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper {// 数据库名称private static final String DATABASE_NAME = "chat.db";// 数据库版本号,每次数据库结构变更时需要递增这个版本号private static final int DATABASE_VERSION = 1;// 聊天记录表名称public static final String TABLE_CHAT = "chat_messages";// 聊天记录各字段名称及类型定义public static final String COLUMN_ID = "_id";public static final String COLUMN_SENDER = "sender";public static final String COLUMN_CONTENT = "content";public static final String COLUMN_MESSAGE_TYPE = "message_type";public static final String COLUMN_TIMESTAMP = "timestamp";public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建聊天记录表的SQL语句String createTableSql = "CREATE TABLE " + TABLE_CHAT + "("+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ COLUMN_SENDER + " TEXT,"+ COLUMN_CONTENT + " TEXT,"+ COLUMN_MESSAGE_TYPE + " TEXT,"+ COLUMN_TIMESTAMP + " INTEGER"+ ")";db.execSQL(createTableSql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 这里简单示例,如果版本升级,先删除旧表再创建新表,实际应用中可能需要更复杂的迁移逻辑db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHAT);onCreate(db);}
}

MainActivity.java(存放在 java 对应包名目录下)

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView recyclerViewChat;private EditText editTextMessage;private Button buttonSend;private ChatAdapter chatAdapter;private DatabaseReference databaseReference;private ValueEventListener valueEventListener;private DBHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerViewChat = findViewById(R.id.recyclerView_chat);editTextMessage = findViewById(R.id.editText_message);buttonSend = findViewById(R.id.button_send);// 初始化数据库帮助类dbHelper = new DBHelper(this);// 设置RecyclerView的布局管理器LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setStackFromEnd(true); // 让新消息显示在底部recyclerViewChat.setLayoutManager(layoutManager);chatAdapter = new ChatAdapter();recyclerViewChat.setAdapter(chatAdapter);// 初始化Firebase数据库引用databaseReference = FirebaseDatabase.getInstance().getReference("messages");// 监听数据库消息变化,实时更新聊天界面(这里可以结合本地数据库做优化,比如先展示本地已有的,再实时更新增量部分等)valueEventListener = new ValueEventListener() {@Overridepublic void onDataChange(@NonNull DataSnapshot dataSnapshot) {List<Message> messages = new ArrayList<>();for (DataSnapshot snapshot : dataSnapshot.getChildren()) {Message message = snapshot.getValue(Message.class);messages.add(message);}chatAdapter = new ChatAdapter();for (Message msg : messages) {chatAdapter.addMessage(msg);}recyclerViewChat.setAdapter(chatAdapter);}@Overridepublic void onCancelled(@NonNull DatabaseError databaseError) {Toast.makeText(MainActivity.this, "读取消息失败", Toast.LENGTH_SHORT).show();}};databaseReference.addValueEventListener(valueEventListener);// 从本地数据库读取历史聊天记录并展示loadChatHistoryFromDB();buttonSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String messageText = editTextMessage.getText().toString().trim();if (!messageText.isEmpty()) {// 这里简单假设当前用户名为固定的,实际要做登录获取等逻辑String sender = "user1";Message message = new Message(sender, messageText, "text");// 将消息保存到Firebase数据库(网络存储,用于实时同步等)databaseReference.push().setValue(message);// 同时将消息插入到本地SQLite数据库insertMessageToDB(message);editTextMessage.setText("");}}});}// 从本地数据库加载聊天历史记录的方法private void loadChatHistoryFromDB() {List<Message> historyMessages = new ArrayList<>();SQLiteDatabase db = dbHelper.getReadableDatabase();String[] columns

软件架构介绍

数据绑定与展示
获取消息数据
消息数据处理与传递
网络存储与同步
数据库操作
网络通信
表现层 - MainActivity
ChatAdapter
业务逻辑层 - Message
数据访问层 - DBHelper
数据访问层 - Firebase相关操作
SQLite数据库
Firebase数据库
  1. 表现层(Presentation Layer):
    主要由MainActivity和相关的布局文件(activity_main.xmlmessage_item.xml等)构成。MainActivity负责处理用户界面的交互逻辑,例如用户输入消息后点击发送按钮的事件响应、接收消息并展示在RecyclerView列表中等操作。布局文件则定义了聊天界面的外观,包括聊天消息展示区域、输入框、发送按钮等各部分的视觉呈现。
    借助ChatAdapter来将消息数据适配并绑定到RecyclerView的每一项上,实现聊天消息列表的展示,它也是表现层与数据层进行交互的一个中间桥梁,负责把从数据层获取到的数据以合适的形式展示在界面上。

  2. 业务逻辑层(Business Logic Layer):
    消息实体类Message属于此层,它定义了聊天消息的结构,包含发送者、消息内容、消息类型以及时间戳等属性,用于在整个应用中对消息进行统一的抽象表示,方便各层之间传递和处理消息相关的数据。
    虽然示例中没有非常复杂的业务逻辑,但像判断消息类型(文本或图片等)来进行不同展示逻辑处理、处理聊天记录的一些简单排序或者筛选等功能都可以在这一层进行扩展和实现,目前简单地体现在ChatAdapterbind方法中对文本消息根据发送者不同设置不同展示样式等逻辑上。

  3. 数据访问层(Data Access Layer):
    包含DBHelper类,用于管理本地 SQLite 数据库的创建、打开、升级以及数据的增删改查操作。它封装了与数据库直接交互的细节,例如创建聊天记录表的 SQL 语句执行、消息数据插入到数据库(insertMessageToDB方法)以及从数据库查询加载聊天历史记录(loadChatHistoryFromDB方法)等操作,为业务逻辑层提供了统一的数据存储和读取接口。
    另外还有与 Firebase 相关的部分(DatabaseReference以及相关的数据库监听逻辑),用于实现网络存储和实时同步聊天记录的功能,通过将消息数据推送到 Firebase 数据库以及监听数据库变化来实时更新界面展示的消息内容,实现多人之间聊天记录的同步。

技术亮点及其实现原理

类似微信聊天界面的布局展示

亮点:打造了一个视觉效果和交互体验较为接近微信聊天界面的布局,能够清晰区分不同用户发送的消息,并且包含了常见的输入框、发送按钮以及表情按钮(预留功能位)等元素,整体界面简洁美观且符合用户使用习惯。

实现原理:

  1. 布局嵌套与组件使用:在主布局文件(activity_main.xml)中,采用RelativeLayout作为根布局,方便对各子布局进行相对位置的定位。内部嵌套RecyclerView用于展示聊天消息列表,通过设置其布局属性使其占满除底部输入框区域之外的空间,并允许垂直滚动来显示多条消息。底部的输入框区域则使用LinearLayout进行水平排列,依次放置表情按钮(ImageButton)、文本输入框(EditText)和发送按钮(Button),各组件设置合适的宽度、高度、背景、文本样式等属性来达到美观的效果。

  2. 消息项布局定制:对于聊天消息列表中的每一项(message_item.xml),使用LinearLayout来整体布局,左边放置显示发送者头像的ImageView,右边再嵌套一个LinearLayout来放置发送者昵称(TextView)和消息内容(TextView)。通过代码逻辑根据消息发送者判断来为消息内容的TextView设置不同的背景样式(如自己发送的居右对齐、背景颜色不同,对方发送的居左对齐、对应背景颜色等),以此区分不同用户的消息,营造类似微信聊天界面的视觉感受。

  3. 样式资源引用:在res/drawable目录下定义了多个 XML 样式资源文件,如用于设置EditText圆角背景的edittext_rounded_bg.xml、发送按钮不同状态下背景样式的button_send_bg.xml以及区分左右消息背景的left_message_bg.xmlright_message_bg.xml等,通过在布局文件中引用这些样式资源,进一步增强了界面的美观性和专业性。

支持多人聊天及实时消息同步

亮点:实现了多人之间进行文本聊天(图片聊天可后续进一步完善扩展),并且聊天记录能够实时同步,所有参与聊天的用户可以及时看到新发送的消息,提升了聊天的交互性和即时性。

实现原理:

  1. Firebase 实时数据库的使用:利用 Firebase 提供的实时数据库服务,在应用中初始化DatabaseReference来指向存储聊天消息的数据库节点(示例中为"messages"节点)。当用户点击发送按钮发送一条消息时(在MainActivity中处理发送按钮点击事件),将构造好的Message对象(包含发送者、消息内容、消息类型等信息)通过push().setValue(message)方法推送到 Firebase 数据库中,Firebase 会自动为每条消息生成一个唯一的键值,并按照设定的结构存储消息数据。

  2. 数据库监听机制:通过添加ValueEventListenerFirebase 数据库指定节点进行监听,在onDataChange回调方法中,一旦数据库中的消息数据发生变化(有新消息插入或者已有消息修改等情况),就会获取到最新的消息数据快照(DataSnapshot),然后解析这些数据创建对应的Message对象列表,并更新到ChatAdapter中,从而实现RecyclerView展示的聊天消息列表实时更新,让所有连接到该数据库的用户都能看到最新的聊天内容。

本地数据库存储聊天记录

亮点:除了使用网络数据库(Firebase 实时数据库)进行实时同步外,还借助本地的 SQLite 数据库来存储聊天记录,既保障了在网络不佳等情况下聊天记录的本地保存,又便于后续查询历史聊天内容、实现离线查看等功能,提升了数据的可靠性和用户体验。

实现原理:

  1. 数据库创建与表结构定义:创建DBHelper类继承自SQLiteOpenHelper,在其onCreate方法中执行创建聊天记录表(名为chat_messages)的 SQL 语句,定义了包含消息唯一标识(_id)、发送者(sender)、消息内容(content)、消息类型(message_type)以及时间戳(timestamp)等字段的表结构,用于存储聊天消息的详细信息。

  2. 数据插入操作:当用户发送消息时,在将消息推送到 Firebase 数据库的同时,会调用insertMessageToDB方法,该方法获取到可写的 SQLite 数据库实例(通过dbHelper.getWritableDatabase()),然后使用ContentValues来封装要插入的消息数据,再通过db.insert方法将消息数据插入到对应的聊天记录表中,实现本地数据库的消息存储。

  3. 历史记录查询与加载:在MainActivityloadChatHistoryFromDB方法中,首先获取可读的 SQLite 数据库实例,然后通过指定查询的列、排序方式等条件,使用db.query方法从聊天记录表中查询出历史聊天记录数据,将获取到的数据游标(Cursor)进行解析,创建Message对象并添加到消息列表中,最后更新到ChatAdapter来展示在聊天界面上,实现了聊天历史记录的加载展示功能。

性能优化与资源管理相关亮点

亮点:注重了一些基本的性能优化和资源管理措施,保障聊天界面滑动流畅不卡顿,并且避免了因不当的资源使用(如数据库监听未及时移除等)导致的内存泄露问题,提升了应用的稳定性和性能表现。

实现原理:

  1. RecyclerView 优化:在ChatAdapter的onBindViewHolder方法中,尽量保持简洁高效的操作逻辑,避免复杂耗时的计算或频繁创建新的视图对象等浪费资源的行为。例如对于图片消息展示虽然示例中未完整实现,但后续可以采用异步加载图片库(如 Glide 等)结合合适的缓存策略(内存缓存和磁盘缓存)来高效加载图片,减少因图片加载导致的卡顿。同时,利用RecyclerView本身的复用ViewHolder机制,正确实现onCreateViewHolderonBindViewHolder方法,确保视图的高效复用,提升列表滚动时的性能表现。

  2. 资源释放与管理:在MainActivityonDestroy方法中,添加了对 Firebase 数据库监听的移除操作(通过databaseReference.removeEventListener(valueEventListener)),当 Activity 销毁时(比如用户退出聊天界面或者切换到其他应用等情况),及时移除数据库监听,避免因持续监听数据库变化导致的内存泄露以及不必要的网络资源占用等问题。对于本地 SQLite 数据库操作,在每次数据库插入或查询等操作完成后,及时关闭数据库连接(如在insertMessageToDB方法结尾处db.close()),防止数据库连接资源的浪费和潜在的资源泄露风险。

自我总结

我是主攻C++方向的,所以在这进两个月的时间里我花了大半个月来学习JAVA、Android 开发和数据库等相关主要知识,包括RecyclerView 使用以及界面布局等知识,也学习了计算机四大件的基础知识。加之学校在大二上学期的学业问题,过量的知识整合对于我来说仍是一个巨大的挑战,我最终的代码调试,程序架构设计以及界面布局仍有很多不足,各个模块之间的耦合也没有很好完成,项目可以说是一塌糊涂,接下来我会继续优化我的项目,知道它是一个完美的APP也不必正在这里阐述自己的总结。

文章链接

在这里向老师表达我最真切的感谢,首先让我来学习到了如此多的只是,也令我深刻反省了自己在计算机领域的不足,单鞋老师!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)

vue3.0生成压缩包&#xff08;含在线地址、前端截图、前端文档&#xff09; 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素&#xff0c;并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…

图像小波去噪与总变分去噪详解与Python实现

目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…

单细胞细胞通讯全流程分析教程,代做分析和辅导

0. 分析参数文件和细胞通讯的演示数据 0.1 细胞通讯分析总的参数文件&#xff0c;后面部分细胞通讯分析模块会用到 分析参数文件 参数文件名称&#xff1a;total_analysis_params_demo.xlsx &#xff0c;很多分析模块都是这个总的参数文件&#xff0c;我的这个总的参数文件如…

auto与decltype

auto: 1.定义&#xff1a; 在C中&#xff0c; auto 是一个类型说明符&#xff0c;它让编译器在编译阶段自动推导变量的类型&#xff0c;其类型取决于初始化表达式的类型。auto 在声明变量时使用&#xff0c;编译器会根据变量初始化表达式自动推断类型。 #include<iostrea…

[Code]R2U-Net中的眼部血管分割

DenseUnet.py import torch import torch.nn as nn import torch.nn.functional as F# 定义一个名为Single_level_densenet的类,继承自nn.Module,它构建了一个单层级的DenseNet结构 class Single_level_densenet(nn.Module):def __init__(self, filters, num_conv=4):super…

Java中的“封装“详解

封装&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;的四大基本特性之一。它通过将数据和操作数据的方法绑定在一起&#xff0c;并隐藏对象的内部实现细节&#xff0c;只提供有限的访问接口来实现。这种机制不仅提高了代码的安全性&#xff0…

深度学习常用方法(一)

1. Dropout 的原理 Dropout 是一种防止神经网络过拟合&#xff08;学习得过于复杂&#xff0c;导致泛化能力差&#xff09;的方法。 原理&#xff1a;在每次训练时&#xff0c;随机“丢弃”一部分神经元&#xff08;即暂时让它们失效&#xff0c;设置为零&#xff09;&#x…

C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现

沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…

【Oracle】个人收集整理的Oracle常用SQL及命令

【建表】 create table emp( id number(12), name nvarchar2(20), primary key(id) ); 【充值一】 insert into emp select rownum,dbms_random.string(*,dbms_random.value(6,20)) from dual connect by level<101; 【充值二】 begin for i in 1..100 loop inser…

RAG (Retrieval Augmented Generation) 检索增强和生成

1 RAG技术简介 1.1 RAG技术概述 RAG&#xff08;Retrieval Augmented Generation&#xff09; 是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在通过利用外部知识库来增强大型语言模型&#xff08;LLMs&am…

Android 编译和使用libheif

项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接&#xff0c;需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题&#xff0c;多了一层路径&…

【无标题】多模态对齐

第一章 绪论 1.1 研究背景和意义 在现实生活中,人类往往是以事件为单位来认识和理解世界的,一个事件包 含了时间、地点、参与者等多个静态因素。将这些事件信息从非结构化数据中提 取出来,已逐渐成为信息抽取领域的关键任务之一。事件通常并非孤立存在,而 是彼此关联,它…

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…

黑马程序员Java笔记整理(day05)

1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组&#xff0c;如: M…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

《Python基础》之数据加密模块hashlib的用法

目录 一、简介 二、用法 步骤一、导入hashlib库 步骤二、创建哈希对象 步骤三、往哈希对象中传值 1、可以在创建对象的时候传值 2、使用updata传值 步骤四、获取经过哈希对象加密后的值 三、注意事项 1、编码问题 2、安全性 3、多次传值 四、总结 一、简介 hashli…

QT实战--qt各种按钮实现

本篇介绍qt一些按钮的实现&#xff0c;包括正常按钮&#xff1b;带有下拉箭头的按钮的各种实现&#xff1b;按钮和箭头两部分分别响应&#xff1b;图片和按钮大小一致&#xff1b;图片和按钮大小不一致的处理&#xff1b;文字和图片位置的按钮 效果图如下&#xff1a; 详细实现…

恶补英语初级第12天,《描述进行中的动作》

对话 Where’s Sally, Jack? She’s in the garden, Jane. What’s she doing? she’s sitting under the tree. Is Tim in the garden, too? Yes, he is. He’s climbing the tree. I beg your pardon? Who’s climbing the tree? Tim is. What about the dog? The dog’…

联表查询,外键

联表查询 使用多表可以减少冗余&#xff0c;便于增删改操作&#xff0c;查询操作复杂 表与表之间通过主键和外键关联 外键 如果一张表的某个列指向另一个表的主键列 &#xff0c;就称之为外键列 -- 添加外键 alter table t_emp add constraint 外键名 foreign key (depart)…

【OJ】前K个高频单词和单词识别和两个数组的交集

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 692. 前K个高频单词1.1 分析1.2 代码 2. KY264 单词识别2.1 分析2.2 代码 3. 349. 两个数组的交集3.1 分析3.2 代码 1. 692. 前K个高频单词 1.1 分析 先试用map来统计每个单词出现的次数&#xff1a; map<string,i…