安康学院本科生毕业论文(设计)
Android中提供了HttpURLConnection和HttpClient接口来开发HTTP程序。首先需要明确的是,HTTP通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求实体中。因此,在编程之前,首先明确使用的请求方法,这里我们采用的是POST请求方式直接访问服务器的URL来获取资源路径。由于我们这里有点别出心裁的借用到了RSS新闻订阅的有效网络资源发布方式,故而,真正的下载资源的URL是自行通过获取到服务器发布的XML文件获取到其中最新更新的文件名与之前的请求服务器的URL字符串合并而成的有效请求下载的URL。
4.2.4 Android多线程断点下载原理
事实上,Android多线程断点下载是包括java多线程下载和Android的SQLite数据库两大部分的。由于在实际中,可能会存在网络的缓慢或者是由于原文件的过大导致用户需要很久才能等待该文件的下载完毕。这种情况下首先引入多线程下载,增加文件传输速率。其原理也比较简单,首先获取网络文件的长度,然后在Android客户端中生成一个与网络文件产度相等的本地文件;开启N条线程下载文件,计算每条线程负责下载的数据量,公式如下:int block = 文件长度%N==0 ? 文件长度/N : 文件长度/N+1;开启多条线程分别从网络文件的不同位置下载数据,并从本地文件相同的位置写入数据,要计算出每条线程从为网络文件的什么位置开始下载数据,到什么位置结束。
而在下载过程中实现的断点功能则要归功于,轻便型嵌入关系型数据库
SQLite。它的存在使得在断点过程中有效的记录了当前的下载位置,把该数据保存在数据库中,在第二次运行的时候再从数据库中提取出来,继续未完的任务。
4.2.5 Android消息队列原理
由于在android中,对UI控件的更新只能由主线程(UI线程)负责,如果在非UI线程更新UI控件,更新的结果不会放映在屏幕上,某些控件还会出错。 可事实上,我们很多结果都是通过其他新线程获取的到的实时数据,针对于种种类似情况,android提供了有效的消息队列机制来帮助解决该问题。尽管android支持多线程,但是在android应用程序中,它只是由一个主线程操作各种UI界面的单线程模式。 1) Message
Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,
46
安康学院本科生毕业论文(设计)
则发送Message内含一些数据给UI线程。 2) Handler
Handler处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的 Handler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的
handleMessage(Message)方法,它是处理这些Message的操作内容,例如Update UI。通常需要子类化Handler来实现handleMessage方法。 3) Message Queue
Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被 Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。 4) Looper
Looper是每条线程里的Message Queue的管家。Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper() 得到当前线程的Looper就有可能为NULL。
4.3 数据库设计
4.3.1 Android内置数据库特性简介
Sqlite3是建立在Android平台上的一个数据库,除了支持varchar(n)(可变字符),char(n)(定长字符)等数据尅性外,还支持空(NULL),整型(INTEGER),文本类型(TEXT)等数据类型。它的特点入下:轻量级(只需带上很小的动态库,就能享受它的全部功能)、独立性(使用不需要安装,在部署的时候能省去很多麻烦)、隔离性(数据库中所有的信息都包含在一个文件内,方便管理和维护)和安全性(可以同时读取数据,但同时只有一个恩能够写入数据)等特性。
47
安康学院本科生毕业论文(设计)
4.3.2 建表语句
1)创建: 1、创建书的表:
create table IF NOT EXISTS book(bid integer primary key autoincrement,bpath varchar(255) not null); 2、创建书签的表:
create table IF NOT EXISTS bookmark(bmid integer primary key autoincrement, bpath varchar(50) not null,bmname varchar(50) not null,bmoffset integer not null,bmsavetime varchar(20) not null); 3、创建用户管理的表:
create table IF NOT EXISTS user(userid integer primary key autoincrement, username varchar(20) not null,password varchar(20) not null, telephone varchar(20) not null);
4、创建最近阅读的表
create table IF NOT EXISTS nearlyread(bookid integer primary key autoincrement, bookname varchar(50) not null,bookreadtime varchar(20) not null); 5、创建下载管理的表
create table IF NOT EXISTS down(downid integer primary key autoincrement, downuser varchar(20) not null,downbook varchar(20) not null, downtime varchar(20) not null);
2)SQlite3数据库使用方法:
选择:select from bookmark where bmid=1; 插入:insert (bookmark,null,values); 删除:delete from bookmark where bmid=3 ;
查找:query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
4.3.3 数据表分析
本数据库用的是一个轻量级嵌入型数据库sqlite3 ,即创建了一个数据库reader.db,在数据库中创建了几张数据表。
在建设网站系统或者软件之前,我们必须对系统所用到的数据进行大致的分类和具体的结构设计,既要做到清晰明了,又要能适应系统各项功能的调用,而不至于产生结构上的逻辑混乱,保证关键数据在意外情况下不会被破坏,可以说
48
安康学院本科生毕业论文(设计)
数据库是系统的重中之重。
数据库设计要遵循一些规则,一个好的数据库满足一些严格的约束和要求。尽量分离各实体对应的表,一个实体对应一个表,搞清楚该实体有哪些属性,对应有些什么字段,以及各实体之间有何种联系。实体、属性与联系是进行概念设计时要考虑的三个元素,也是一个好的数据库设计的核心。
不管是在MIS系统中,还是其他系统软件中,数据库设计师需要紧密的思维逻辑将一些属性进行封装然后存放至数据库,而数据库的管理操作则通过对表的基本增删改查语句来获取某些数据表里面的内容,所以作为软件开发,对表结构和数据逻辑的层次一定要清晰理解。以下是该款软件涉及到的一些数据库表的结构信息:
Book表(用来存放书籍,如表4-1):
字段名称 bid
数据类型
条件约束
integer
varchar(255)
primary key not null
bpath
表 4-1 书籍数据表
Bookmark表(管理书签,如表4-2):
字段名称
数据类型
条件约束
Bmid Bpath Bmname bmoffset msavetime
Integer varchar(50) varchar(50) Integer varchar(20)
表 4-2 书签数据表
primary key not null not null not null not null
User表(用户数据,如表4-3):
字段名称
数据类型
条件约束
Userid username password telephone
Integer varchar(50) varchar(50) varchar(20)
表 4-3 用户数据表
primary key not null not null not null
Nearlyread表(最近阅读,如表4-4):
49
安康学院本科生毕业论文(设计)
字段名称 数据类型 条件约束
Bookid bookname bookreadtime
Integer varchar(50) varchar(20)
表 4-4 最近阅读数据表
primary key not null not null
Down表(下载,如表4-5)::
字段名称
数据类型
条件约束
Downid Downuser downtime
Integer varchar(50) varchar(20)
表 4-5 下载数据表
primary key not null not null
50