打卡21
1.新学期目标2.打卡3.打卡24.打卡35.打卡 46.打卡57.打卡68.打卡79.打卡810.打卡911.打卡1012.结对作业(地铁查询项目)0113.结对作业(地铁项目)0214.结对作业(地铁项目)0315.结对作业(地铁项目)0416.结对作业(地铁项目)0517.结对作业(地铁项目)0618.结对作业(地铁项目)0719.结对作业(地铁项目)0820.结对作业(地铁项目)0921.结对作业(地铁项目)1022.结对作业(地铁项目)1123.结对作业(地铁项目)1224.结对作业(地铁项目)1325.结对作业(地铁项目)1426.五一冲刺(政策查询系统)127.五一冲刺(政策查询系统)228.政策查询系统(安卓)129.政策查询系统(安卓)230.政策查询系统(安卓)331.政策查询系统(安卓)432.政策查询系统(安卓)533.政策查询系统(安卓)634.政策查询系统(安卓)735.JS开发36.安卓app开发相关37.第一次个人作业(安卓学习记录系统)0138.第一次个人作业(安卓学习记录系统)0239.第一次个人作业(安卓学习记录系统)0340.第一次个人作业(安卓学习记录系统)0441.第一次个人作业(安卓学习记录系统)0542.第一次个人作业(安卓学习记录系统)0643.第一次个人作业(安卓学习记录系统)0744.打卡1145.打卡1246.打卡1347.打卡1448.打卡1549.打卡1650.打卡1751.打卡1852.打卡1953.打卡2054.python学习55.python学习256.python学习357.Javaweb
58.打卡21
59.fragment学习和使用60.mybits学习161.mybits学习262.mybits学习363.课程总结64.个人总结
所花时间(包括上课): |
2h |
代码量(行): |
150左右 |
搏客量(篇): |
1 |
了解到的知识点: |
安卓 |
备注(其他): |
今天进行整合时,发现安卓端的自动检索数据库进行弹窗的功能还没没有进行解决
以下是在网上找到的思路
创建一个名为DatabaseChecker
的线程,在其中实现与MySQL数据库的连接、执行检索代码、比较数据变化、推送通知窗口等功能。在该线程的run()方法中,将会不断执行定时检索代码。
public class DatabaseChecker extends Thread {
private Context context;
private boolean running = false;
private Timer timer;
public DatabaseChecker(Context context) {
this.context = context.getApplicationContext();
}
public synchronized void startChecking() {
if (!running) {
running = true;
timer = new Timer();
timer.schedule(new MyTimerTask(), 0, 10000);
}
}
@Override
public synchronized void run() {
while (running) {
// 执行数据库检索代码
checkDataUpdate();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void stopChecking() {
if (running) {
running = false;
timer.cancel();
}
}
private class MyTimerTask extends TimerTask {
@Override
public void run() {
// 执行数据库检索代码
checkDataUpdate();
}
}
private void checkDataUpdate() {
// 执行MySQL查询代码
ResultSet newResult = queryDataFromMysql();
if (newResult == null) {
return;
}
if (oldResult == null) {
oldResult = newResult;
return;
}
try {
if (!oldResult.next() && !newResult.next()) {
return;
}
if (oldResult.next() != newResult.next()) {
// 数据库数据发生变化,推送弹窗
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context, "channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("数据更新提示")
.setContentText("数据库中的数据已更新")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(context);
// notificationId是应用程序中的通知唯一标识符
notificationManager.notify(notificationId, builder.build());
}
oldResult = newResult;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在DatabaseChecker
类中,queryDataFromMysql()
方法的实现可以参考下面的步骤。
- 在主界面中启动检索线程
在 MainActivity 的 onCreate() 方法中启动 DatabaseChecker
线程,如下所示:
public class MainActivity extends AppCompatActivity {
private DatabaseChecker databaseChecker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseChecker = new DatabaseChecker(this);
databaseChecker.startChecking();
}
@Override
protected void onDestroy() {
super.onDestroy();
databaseChecker.stopChecking();
}
}
- 解析数据库检索结果
在checkDataUpdate()
方法中对检索结果进行解析,将当前和上一次的结果进行比较。在第一次检索时,可以将oldResult
字段设为null
,以便在后续的检索中不会将第一条记录误判成更新数据。
private ResultSet oldResult;
private ResultSet queryDataFromMysql() {
ResultSet result = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://MySQL服务器名称:端口号/数据库名称",
"数据库用户名", "数据库密码");
String sql = "select * from 数据表名称";
Statement statement = connection.createStatement();
result = statement.executeQuery(sql);
statement.close();
connection.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "连接数据库失败", Toast.LENGTH_SHORT).show();
}
return result;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效