您的位置:首页 > 编程语言 > Java开发

一个简单的java桌面应用:单机版IFTTT

2015-11-16 16:06 232 查看
项目背景

项目简介

项目分析
项目结构

文件结构

执行流程
打开程序

新建任务

编辑任务

任务逻辑
执行任务
this子任务定时器

this子任务接收邮件

that子任务发邮件

that子任务发微博

停止任务

数据库存取的实现

总结

项目源码链接

1.项目背景:

ifttt是“if this then that”的缩写,事实上是让你的网络行为能够引发连锁反应、让你使用更为方便。ifttt旨在帮助人们利用各网站的开放API,将各个网站或应用衔接,完成任务。ifttt通过流程将各种信息串联起来,然后再集中把你要的信息呈现给你。解决了信息的冗杂,收取或关注重要信息的问题。

2.项目简介:

本项目是由java编写的一款基于触发器-动作框架的IFTTT窗口程序。

用户可以指定this和that事件。当应用监测到this事件发生时,将自动执行that事件。

当前可供选择的this事件有:

定时器

指定的QQ邮箱收到邮件(可指定发件人邮箱包含某一子串)

当前可供选择的that事件有:

通过QQ邮箱发送邮件

发布新浪微博

3.项目分析:

点击下载项目源码

项目结构

本项目主要包括三个模块:

UI模块

UI模块定义了各种窗口,提供了友好的用户界面,并对用户的操作作出响应。

task模块

task模块主要有两方面功能。

管理数据。task模块记录各个任务的信息,并提供访问、添加、删除任务的接口。

执行任务。收到用户请求后,task模块讲在后台执行指定任务。

database模块

database模块提供了将任务信息转换并存储的方法与将任务信息读取并解析的方法。

在程序启动时,从database中读取上一次保存的任务信息。

在程序终止时,当前的任务信息将保存到database中。

文件结构

src

ifttt

ifttt.java//程序入口

task

TaskManager.java//任务管理类

TaskHandler.java//任务执行类

Task.java//任务类

ThisClock.java//子任务类,this事件–定时器

ThisMail.java//子任务类,this事件–收到邮件

ThatMail.java//子任务类,that事件–发邮件

ThatWeibo.java//子任务类,that事件–发微博

ui

ClockPanel.java//通用控件

MailReceivedPanel.java//通用控件

TaskPanel.java//通用控件

mainWindow

MainWindow.java//窗口:主界面

editTask

EditTaskPanel.java//继承自TaskPanel.java

EditTaskWindow.java//窗口:编辑任务

newTask

NewTaskPanel.java//继承自TaskPanel.java

NewTaskWindow.java//窗口:新建任务

help

AboutWindow.java//窗口:关于

InstractionWindow.java//窗口:使用说明

weibo

WeiboOauth.java//窗口:进行微博授权

database

SqliteDB.java//数据库读写类

weibo4j

//新浪微博SDK

执行流程

打开程序

程序从ifttt.java中的main函数开始执行。

main函数做了三件事:

调用TaskManager的initial方法。

这个方法初始化了tasklist与threadlist。并调用SqliteDB.readDB,将数据库中的信息读入tasklist中。

tasklist维护了一个当前已有任务的序列。(由于每个任务的执行需要新建一个单独的线程,因此建立一个与tasklist一一对应的threadlist。)

使用substance进行界面美化。

这是java swing的一个开源皮肤包。只要进行简单的设置就可以美化界面。

打开mainwindow。

主界面mainwindow打开后,用户将通过mainwindow控制程序。



mainwindow的menubar中有两个选项,任务和帮助。

任务选项下有两个选择,新建任务与编辑任务(删除任务的功能集成在编辑任务中)。

帮助选项下有两个选择,使用说明与关于。点击这两个按钮弹出的都是只包含文本的窗口。提供了相关信息。

主界面中有一个combobox控件,可以从中选择已有任务。

一个开始按钮与一个停止按钮可以对任务进行控制。

两个不可编辑的文本框,一个显示当前任务的具体描述,一个显示正在执行的任务的执行状况。

mainwindow关闭时,将触发监听器,执行SqliteDB.saveDB方法,将已有的任务保存到数据库中后退出程序。

新建任务



用户点击新建任务,将打开新建任务窗口。

新建任务窗口中,用户可以填入任务名称,选择this子任务的类型,that子任务的类型。

选择不同的子任务时,界面外观将发生改变,供用户填入适当内容。



微博认证

选择发送微博的子任务时,会出现一个微博授权按钮,点击微博授权按钮,将弹出一个新的窗口。

在微博认证窗口中,点击开始认证,将打开浏览器进入应用授权界面。授权成功后将跳转到百度首页,将地址栏的code内容复制到本窗口中。

点击确认,授权成功。

由于本应用是未审核应用,因此每次授权有效期仅为24小时。

新建任务窗口下方有三个按钮,分别为确定、重置、取消。

点击重置按钮,窗口将恢复初始状态。

点击取消按钮,窗口将关闭。

点击确定按钮,将执行新建任务逻辑。

监听器调用NewTaskWindow.newTask(),

传入相关数据,新建一个Task对象,

通过TaskManager.addTask()方法将新建的task加入tasklist中。

threadlist将同步扩展,添加一个null项。

通知mainwindow添加任务,刷新界面。

关闭新建任务窗口。

编辑任务



编辑任务界面与新建任务界面基本相同。

多出一个选择任务的box。选择任务后,界面将变化,自动填入选中任务的信息。

多出一个删除按钮。

点击删除,将调用TaskManager.deleteTask()方法,删除选中的任务。threadlist中的对应项也将被删除。

点击确定按钮,将执行编辑任务逻辑。

删除tasklist中的原task。

生成新的task,插入tasklist的对应位置。

通知mainwindow更新任务。

关闭编辑任务窗口。

4.任务逻辑

执行任务:

主界面点击执行任务,执行按钮将变为不可点击,停止按钮将变为可以点击。

调用taskmanager.starttask()方法,执行指定任务。

此方法将标记当前任务为running状态,新建一个线程,在线程中新建taskhandler对象执行任务。

remove掉threadlist中原来的线程(也可能为null),插入刚刚创建的线程。

调用thread.start()执行此线程。

taskhandler通过task.getThisAction获得this子任务,判断this的任务类型,执行this子任务。

this子任务:定时器

调用thisClock.doTask执行任务。

新建TimerTask,内容为执行taskHandler.doThatTask,执行that子任务。

新建Timer对象,将TimerTask加入Timer,并设定时间。返回。

this子任务:接收邮件。

具体功能的实现可以参照下面这个链接:

Java基于smtp与pop3实现收发邮件的功能

调用thisMail.doTask执行任务。

通过pop3协议连接QQ邮箱的pop3服务器。

每隔一定时间,遍历邮件列表,从新往旧。

当遇到上一次遍历过的邮件或者遇到任务开始时间之前的邮件即完成一次遍历。

发现满足条件的邮件时,跳出循环,执行taskHandler.doThatTask,执行that子任务。

that子任务:发邮件

Java基于smtp与pop3实现收发邮件的功能

- 调用thatMail.doTask执行任务。

- 通过SMTP协议登录QQ邮箱的SMTP服务器。

- 发送邮件。返回。

that子任务:发微博

Java基于新浪微博SDK实现发微博的功能

- 微博授权时,用户填入code。应用即获取access_token。

- 用access_token发送微博。

- 任务结束后,将调用TaskManager.taskEnd()方法。

- 将当前task的状态设置为notRunning。并通知mainwindow执行updateMainWindow更新界面。

停止任务:

主界面点击停止任务,执行按钮将变为可以点击,停止按钮将变为不可点击。

调用TaskManager的stopTask方法。

此方法将判断this子任务的类型。

如果是定时器任务,将调用thisClock的stopTask方法。

此方法中,执行timer.cancel()取消任务。

如果是接收邮件任务,将执行thread.interrupt方法传递中断请求。

如果thread在sleep,将抛出一个exception,在异常处理中结束此任务。

如果thread在运行,在下一次判断interruped状态时将会结束(每一次遍历邮件列表将会判断是否有中断请求)。

数据库存取的实现:

具体请参考:Java将对象直接在数据库中存取的方法

task类及四个子任务类都实现了Serializable接口。

存储:

遍历tasklist,将task序列化,输出到一个byte类型的数组中。

将这个数组存入数据库中。

读取:

遍历数据库,将每一条记录读到一个byte类型数组中。

将这个数组反序列化转为task对象。

加入tasklist。

总结

到这里,这个项目大体上已经介绍完毕。收发邮件、发微博、数据库这三个部分我会再写三篇详细介绍,并在本文中贴出地址。

有疑问欢迎联系leejf1994@outlook.com交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: