网站手机客户端的设计与实现 毕业设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单位代码10
学号
分类号TP393
密级
毕业设计说明书网站手机客户端的设计与实现
院(系)名称
专业名称
学生姓名
指导教师QQ997237619
年5月14日
网站手机客户端的设计与实现
摘要
随着3G技术的发展,移动客户端已成为信息系统的发布平台,利用Internet向手机客户端发送信息、提供户浏览和使用技术是信息系统发展的必然趋势。
手机客户端是指依据系统的观点,通过计算机、网络。
及嵌入式客户端等现代化工具和设备,运用Intent 传输的方法,服务于管理领域人机相结合的信息处理系统。
它通过对信息进行采集、处理、存储、管理、检索和传输,向有关人员提供有用信息。
本系统主要通过基于java的软件编程,把网站的信息通过手机客户端的形式展示给用户。
不仅包括了网站系统的信息,同时也同步了网站的会员信息管理数据库,能够方面的进行用户登录和注册。
本系统基于android sdk利用android的智能系统提供的丰富开发类库巧妙的实现了android平台的可运行软件。
通过合理的利用目前发展的3G网络该客户端大大减少了网络访问的局限性,增强了网站信息的管理和获取能力。
同时通过即时的数据更新为用户节省了大量的宝贵时间并大大提高了工作效率。
关键词:3G;Intent transmission;手机;存储
Mobile Client Design and Implimentation for Course of TCP/IP
Theory and Application
Author:Zhu jiule
Tutor:Sun Feixian
Abstract
With the development of 3G, mobile client has become the popular platform for information system, the use of the Internet to the mobile client to send information to provide the families to browse and use of technology is the inevitable trend of development of information systems. This client based on the system's point of view, through the computer network. Modern tools and equipment, and embedded client to use Intent transmission method, the service management field of human-computer combination of information processing systems. By the information collection, processing, storage, management, retrieval and transmission, to provide useful information to the persons concerned.
This client is based on Java programming, website information displayed by the form of a mobile client to the user. Site includes not only information, but also synchronizes site membership information management database, which allows easy user login and registration. The system is based on the android sdk android smart system provides rich development libraries clever Android platform can run the software.
Greatly reduce the limitations of the network access the 3G network development through the rational use of the client, and enhance the management of website information and the ability to obtain. By real-time data updates for the user to save a lot of valuable time and greatly improved work efficiency.
Keywords:3G,Intent transmission,Mobil,Storage
目录
1 绪论 (1)
1.1 选题背景 (1)
1.2 课题来源 (1)
1.3 毕设任务及本人贡献 (1)
1.4 毕业设计说明书的组织结构 (2)
2 需求分析 (3)
2.1 功能需求 (3)
2.2 性能需求 (3)
2.3 用户需求 (3)
3 系统设计 (4)
3.1 总体设计 (4)
3.2 详细设计 (4)
3.2.1 客户端整体框架的设计 (5)
3.2.2 模块显示效果和业务逻辑的设计 (6)
4 系统实现 (7)
4.1 系统实现环境说明 (7)
4.2 主要模块的实现 (7)
4.2.1 登录注册模块的实现 (7)
4.2.2 信息显示页面的实现 (11)
4.2.3 信息推广功能的实现 (15)
4.2.4 发帖功能的实现 (16)
4.2.5 收藏功能的实现 (19)
4.2.6 团购功能的实现 (21)
5 系统测试 (28)
5.1 测试目的 (28)
5.2 测试方法 (28)
5.3 测试用例与测试结果 (29)
5.4 测试结论 (32)
结论 (33)
致谢 (34)
参考文献 (35)
1 绪论
1.1选题背景
随着移动通信与Internet向移动终端的普及,网络和用户对移动终端的要求越来越高,而Symbian,Windows Mobile,PalmOS等手机平台过于封闭,不能很好的满足用户的需求,因此市场迫切需要一个开发性很强的平台。
经过多年的发展,第三代数字通信(3G)技术活动了广泛的接受,它为移动终端用户带来了更快的数据传输速率。
随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。
因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
Google为此与2007年11月推出了一个专为移动设备设计的软件平台——Android[1]。
Android 是一套真正意义上的开发性的移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。
Android 是由Linux+Java构成的开源软件,允许所有厂商和个人在其基础上进行开发。
Android平台的开放性等特点既能促进技术(包括平台本身)的创新,又有助于降低开发成本,还可以是运营商能非常方便地制定自己的特色化的产品。
因此,它具有很大的市场发展潜力。
根据中国互联网信息中心(CNNIC)发布的《第22次中国互联网络发展状况统计报告》显示,截止2008年6月底,我国网民数量达到了2.53亿,首次大幅超过美国,网民规模跃居世界第一位,其中手机网民达到7305万,手机上网成为网络接入的一个重要发展方向[2]。
1.2 课题来源
设计的灵感来源于网站的限制性,随着3G网络在中国的普及,互联网的访问如果只单纯的在便携式电脑上的操作就会变的过分的单一。
如果能把网站的显示模式转移到手机上那么就会给用户省下了大量的时间,同时也可以很方便的让网站的会员即时的管理自己的信息和获得相关服务的最新动态。
1.3 毕设任务及本人贡献
毕业设计任务就是开发出一个android系统上运行的网站手机客户端软件,其中主要任务有一下几点:
(1) 利用网站后台数据接口获取到相关页面的信息;
(2) 将网站页面的先关信息加载到相应的模块当中;
(3) 利用手机客户端对账户进行登录注册等业务的管理;
(4) 获取网站即时更新的信息,和上传信息到网站服务器;
(5) 利用http协议进行文件的传输。
在此系统的开发中,本人的主要贡献包括:
(1) 参与完成系统总体设计方案和数据库逻辑结构设计;
(2) 参与后台服务器数据库的设计和实现;
(3) 设计、编程实现并测试关键数据的安全存储、安全传输模块[3]。
1.4 毕业设计说明书的组织结构
本论文包括中英文摘要、目录、绪论、正文、结论、参考文献、致谢,共七个部分。
其中,论文的引言、正文和结论三部分的组织安排如下:
第1章绪论。
本章依次介绍了课题来源,设计任务,主要工作,最后列出了论文的组织结构。
第2章系统需求分析。
本章介绍了网站手机客户端的需求分析,给出了该系统的功能需求,性能需求和用户需求。
第3章系统设计。
本章给出了网站手机客户端的一些具体的设计,其中给出了系统设计,数据库设计和详细设计这三大模块。
第4章系统测试。
本章给出了通过java的常用测试方法的测试用例来完成整个系统的测试和测试总结的工作。
第5章结论。
对整个网站手机客户端的开发总结。
2 需求分析
2.1 功能需求
在“网站手机客户端”中,网站内容展示和动态网站对接主要有一下功能:
(1) 网站内容展示:使用基于tcp/ip协议对网站数据进行;
(2) 关键数据的安全传输:在服务器端和客户端之间实现数据的安全传输[4]。
2.2 性能需求
(1) 能够正确的获取从服务器返回的json数据格式;
(2) 能够正常联通服务器,并进行即时的数据交互;
(3) 鉴于系统的限制,控制程序不出现内存溢出;
(4) 在保证程序正常运行的前提下,对程序进行优化,以达到流畅的实用效果。
2.3 用户需求
(1) 在系统能正常运行的基础上优化界面显示结构,使应用的界面更能贴近用户实用需求。
(2) 针对于智能手机的客户端,需要体现智能手机智能的一面(如:能够动态的帮助用户输入相关信息及减少用户输入的麻烦。
(3) 能够通过手机和网站进行很好的交互工作,以达到掌上控制自己的信息的目的。
3 系统设计
3.1 总体设计
(1) 网站的登录于注册;
(2) 网站信息和内容的相关展示; (3) 论坛发帖模块;
(4) 通过短信或者email 转发网站中的推广信息 (5) 团购订单信息模块;
(6) 用户收藏网站中先关信息模;
在网站手机客户端中主要包括以下6个模块,如图3.1所示。
图3.1 图书管理系统功能模块图
3.2 详细设计
对于网站手机客户端的设计问题主要包括客户端整体框架的设计和具体模块显示效果和业务逻辑的设计,其中设计流程图如图3.2所示。
非会员登录 会员登录
会
会员注册
反
反馈信
息
转
信息推广
信
浏览信息
图
登录注
册
图
浏览信息
图
信息推广
图
论坛发帖
信
收藏功能
学
团购功能
网站手机客户端
图3.2 系统的整体设计
3.2.1 客户端整体框架的设计
(1) android 系统软件的开发有别于j2ee 网站和游戏开发,没有一套完成的项目框架结构去为软件作为系统框架,但是整体的框架逻辑也是基于MVC 开发模式,因此在系统框架的设计方面该客户端采用页面部分新建类继承android 系统组建Activity 用来显示效果,同事采用android 系统组建ListView 去展示数据和列出数据结构。
(2) 使用android 设计机制栈管理去管理页面的显示顺序和销毁顺序。
在android 中加载一个Activity 就是在栈中加入一个对象,于此同时后续的不断的点击更新页面就会不断的往该栈中添加Activity 对象。
这样我们就可以利用栈管理的方法一方面可以边加载边销毁其他不使用的对象,宁一方面可以利用先进后出的原理来显示想要的页面信息,因此在使用android 来实现网站客户端以前必须详细了解android 对Activity 对内存管理和栈管理的机制。
这样就可以在客户端设计和管理上实现游刃有余的效果和要求。
(3) 学习android 的数据管理和数据解析。
Android 网站手机客户端的信息都是动态的从服务器去获取,因此我们需要了解android 从服务器获取的数据格式这样才能更好的在客户端实现数据的显示效果和页面美化效果。
Android 从服务器获取的数据基本上是使用json 字符串或者xml 格式的数据流,在了解了以上信息的基础上我们就需要进一步了接数据解析的相关内容,josn 数据android 定义了很好的json 的数据解析包供我们使用它会比xml 的流传输更加的快速和简洁。
因此在此客户端的实现上我们就采用的是
规划项目框架
20406080100120一月
二月
三月
四月
亚洲区欧洲区北美区
划分系统模块
设计具体模块显示效果及逻辑 文字显示效果
内容排版
业务逻辑设计
josn数据解析技术来实现数据的获取任务[5]。
3.2.2 模块显示效果和业务逻辑的设计
(1) 客户端的显示效果是客户接触应用时最先接触到的部分,一个好的显示效果会让用户感觉到眼前一亮同时也会增加用户实用软件的兴趣。
但是由于本人艺术能力有限,和开发环境的限制。
对于客户端的显示效果只能从我们同学和朋友中征求意见然后逐一纠正;其次业务逻辑也是一个应用至关重要的组成部分,良好的业务逻辑能让用户对系统的功能一目了然,从然增强了系统的使用行。
如果因此在此客户端中,业务逻辑的设计我采用的是先设定一个启示页面,然后每个页面都有一个返回按钮来方便返回初始页面。
而且在这个基础上对每个模块都添加了android系统手机返回按钮的监听事件,这样更加方便的使用户退出该系统进入手机的home界面[6]。
(2) 不同的客户对android的软件需求有不同的要求,我们不能完全达到所有客户的美化要求,但是我们可以根据不同客户的整体需求来实现客户端的美化效果。
这样主要一下几个方面:第一,我们可以通过对代码的优化实现客户端的使用流畅性,第二,我们可以设置网络链接超时的时间,去提醒用户网络连接不通畅。
第三,我们可以通过android的应用机制首先选择Wifi网络,为用户减少收费的流量网络。
这样通过以上几个方面都能大大的提升用户的使用感觉。
(3) 一个android的软件的使用感觉的好坏好取决于,软件设计者对用户使用者自身的考虑。
如一般的用户在数据输入方面都不会向程序员那样有那么熟练的输入数据的技巧,因此在软件设计的同时我们要进一步优化软件的输入结构于输入法的输入顺序,及软件的智能性。
在该系统中我们采用android的智能封装,大量减少用户数据输入的繁琐性。
比如在输入手机号码的时候我们自动弹出只有数字的软键盘,这样就减少了用户在更换软键盘的时候带来的时间浪费。
当然还有在浏览网页信息的同时我们会智能的通过用户选择的信息自动录入到手机内部方便用户对网站信息的推广和使用....诸如此类的还有很多。
所以我们在软件的设计过程中详细的通过站在用户的使用角度,把软件的设计更加智能化,合理化和简洁化。
综上所诉,网站客户端的设计是基于android的系统和用户的使用及艺术设计效果去做出的综合的全面的,及可行性强的设计方案。
软件的设计就犹如一个软件的灵魂和命脉。
把握好设计的关卡就等于成功了一半。
4 系统实现
4.1 系统实现环境说明
该系统主要运用于android1.5版本以上,其中包括android智能手机和android平板电脑等设备。
因为android 系统相关软件的研发是基于android sdk的操作,故系统开发采用的是java高级编程语言,数据库的设计主要是采用android内置的数据库sqlite,数据库本身会跟随APK在android平台的安装内置到android的应用环境当中
4.2 主要模块的实现
4.2.1 登录注册模块的实现
登录和注册是系统进入后的首页面,如果用户已经通过网站注册过网站的会员账户,则可以直接通过手机客户端进行用户的登录,如果用户没有注册过该网站的会员,同样也可以通过本客户端进行注册。
同时为了方便其他非会员用户对网站的了解,在此客户端中放入了随便看看的选项。
提供用户在非注册的情况下对网站有一个全面系统的了解[7]。
但是非会员用户会有一定的使用限制,如:不能在网站手机客户端进行发帖,收藏,和团购等便利服务。
其中注册和登录的主要代码如下:
public class Login extends Activity implements OnClickListener {
private Button btn_login, btn_back, btn_register;
private ImageButton btn_reflash;
private String password = null;
public static int uid;
public static String userName;
public String email;
private EditText name, pass;
private int TAG;
ProgressDialog progressDialog;
SharedPreferences shared;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
shared = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
userName = shared.getString("userName", "");
if (userName != null && !userName.equals("")) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
Intent intent = new Intent(this, Channel.class);
startActivity(intent);
} else {
setContentView(yout.login);
init();
}
}
private void init() {
btn_login = (Button) findViewById(R.id.btn_login);
btn_login.setOnClickListener(this);
btn_back = (Button) findViewById(R.id.btn_back);
btn_back.setOnClickListener(this);
btn_register = (Button) findViewById(R.id.bushihuiyuan);
btn_register.setOnClickListener(this);
name = (EditText) findViewById(ername_text);
pass = (EditText) findViewById(R.id.password_text);
}
在应用中程序需要对系统的组建添加监听事件,这样才能有效的捕捉用户的单机是滑动事件。
在android中对于点击事件的监听使用的是java的匿名内部类实现onclick()方法然后根据系统的回调实现系统对用户点击事件的监听。
相关代码如下:public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_login:
System.out.println("单击");
validate();
break;
case R.id.btn_back:
Intent intent1 = new Intent(this, Channel.class);
startActivity(intent1);
finish();
break;
case R.id.bushihuiyuan:
TAG = getIntent().getIntExtra("tag", 0);
Intent intent = new Intent();
intent.putExtra("tag", TAG);
intent.setClass(Login.this, Register.class);
startActivity(intent);
finish();
break;
}
}
对于android向服务器发送数据请求的功能模块来说,首先要判断发送数据是否为null,在确保数据格式的正确的前提下根据tcp/ip协议依据仿照浏览器的数据访问格式像服务器递交相关请求,同时获得服务器返回的相关数据[8]。
具体实现代码如下:public void validate() {
userName = name.getText().toString();
password = pass.getText().toString();
if (userName.equals("") || userName == null || password.equals("")
|| password == null) {
CommenUtil.showDialog(null, "用户名或密码不能为空", Login.this, "重试");
return;
} else {
progressDialog = ProgressDialog.show(Login.this, "请稍等....",
"获取数据中....");
String result = WebServiceClient.login(Login.this, userName,
password);
System.out.println(result);
if (result != null && !result.equals("")) {
if (result.substring(0, 1).equals("[")) {
try {
JSONArray array = new JSONArray(result);
JSONObject ob = array.getJSONObject(0);
uid = ob.getInt("uid");
userName = ob.getString("username");
email = ob.getString("email");
if (userName != null && !userName.equals("")
&& email != null && !email.equals("")) {
successDialog("登录成功");
progressDialog.dismiss();
}
} catch (Exception e)
CommenUtil.showDialog("提示信息", "登录失败!", Login.this, "确定")
progressDialog.dismiss();
}
}
else {
CommenUtil .showDialog("提示信息", "用户名或密码错误!", Login.this, "确定");
progressDialog.dismiss();
}
}
}
}
显示效果如图4.1所示。
图4.1 登录注册模块的实现
其中需要注意的是我们每一个页面都要在配置文件中声明此类为Activity,否则系统无法识别这一页面。
注册方法是在AndroidManifest.xml中添加如下代码:
<activityandroid:name=".Login"android:label="@string/app_name"android:screenOrientatio ="portrait"/>
4.2.2 信息显示页面的实现
信息显示页面主要是对服务器获取的数据进行相关的排列[9],通过开发前模块的界面设计把数据动态的添加到系统的显示页面上去其中相关代码如下:
private void findView() {
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
content_text = bundle.getString("comment");
if (content_text != null) {
comment.jsonAnalytic(content_text);
titleName = comment.getContent();
author_text = comment.getAuthor();
click_text = comment.getClickCount();
reply_text = comment.getReplyCount();
url = comment.getUrl();
if (reply_text + 1 % 5 == 0) {
pageCount = (reply_text + 1 / 5);
} else {
pageCount = (reply_text / 5) + 1;
}
pageUrl = url + "&page=" + pageNumber;
} else {
url = bundle.getString("url");
pageUrl = url + "&page=" + pageNumber;
}
}
System.out.println("pageUrl :" + pageUrl);
webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setSupportZoom(true);
webView.loadUrl(pageUrl);
webView.setWebViewClient(new MyWebViewClient());
// 设置可以访问文件
webView.getSettings().setAllowFileAccess(true);
// 设置支持缩放
webView.getSettings().setBuiltInZoomControls(true);
pop_bottom = (LinearLayout) findViewById(R.id.bottom123); Img2 = (TextView) findViewById(R.id.shangyiye);
Img2.setOnClickListener(this);
Img3 = (TextView) findViewById(R.id.caozuo);
Img3.setOnClickListener(this);
Img4 = (TextView) findViewById(R.id.xiayiye);
Img4.setOnClickListener(this);
Img5 = (TextView) findViewById(R.id.shuaxin);
Img5.setOnClickListener(this);
btn_index_back = (ImageButton) findViewById(R.id.btn_backindex);
btn_index_back.setVisibility(View.VISIBLE);
btn_index_back.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
在实现智能输入的过程中需要对我们所选择的文本进行正则表达式判断以此来获取我们想要进行的数据和服务操作,为用户带来相关智能手机的方便快捷的体验,因为android是基于java的编程开发,基本的业务实现功能都是基于java去实现所以在考虑到数据辨别的方案上首先选择对字符串的正则表达式的判断[10]。
其中实现代码如下:public static String delHTMLTag(String htmlStr){
String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>";
String regEx_style="<style[^>]*?>[\\s\\S]*?<\\/style>";
String regEx_html="<[^>]+>"; Pattern
p_script=pile(regEx_script,Pattern.CASE_INSENSITIVE);
Matcher m_script=p_script.matcher(htmlStr);
htmlStr=m_script.replaceAll(""); Pattern
p_style=pile(regEx_style,Pattern.CASE_INSENSITIVE);
Matcher m_style=p_style.matcher(htmlStr);
htmlStr=m_style.replaceAll(""); Pattern
p_html=pile(regEx_html,Pattern.CASE_INSENSITIVE);
Matcher m_html=p_html.matcher(htmlStr);
htmlStr=m_html.replaceAll("");
Stringcontent=htmlStr.trim().replaceAll("<p.*?>",
"\r\n").replaceAll("<br\\s*/?>", "\r\n").replaceAll("\\<.*?>", "").replaceAll(" ", "");
return content;
}
}
这样的数据显示是通过分列数据来显示即android的listview控件去按照自己定义的排列顺序去加载不同的现实数据,让程序达到整齐划一的使用感受[12]其中显示效果如图4.2所示。
图4.2 数据显示模块
通过android的Listview控件把数据加载到页面以后点击Listview的item就会进行进一步的页面加载其中这样的页面属于手机的wap页面区别于网站的wab页面,这样就可以通过服务器先给具体数据内容编辑好,之后通过手机封装的WebView控件来显示服务器发回的数据。
通过Webview来获取数据时在整个客户端中比较重要的一部分,这样不仅让客户端有访问网站的效果,同时因为是访问wap页面这样会节省了大量的流量资费让用户可以放心的去访问网站的信息而不用担心生成大量的网络资费。
在3G即将普遍的时候,流量问题成为用户关心的焦点。
所以在此客户端中着重考虑到这一方面。
显示效果如图4.3所示。
图4.3 数据显示之wap页面
4.2.3 信息推广功能的实现
(1) 在android中信息推广主要通过短信和邮件的方式进行发送消息,我使用了android系统封装的方法实现该功能主要代码如下:
public void sendpicToEmail(String imagePath) {
File file = new File(imagePath);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, " 我在手机客户端中看到这篇文章想于您分享:"+ "\r\n" + "(" + pageUrl + "));
intent.putExtra(Intent.EXTRA_SUBJECT, titleName);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); // 添加附件,附件为file对象
if (file.getName().endsWith(".gz")) {
intent.setType("application/x-gzip");
} else if (file.getName().endsWith(".txt")) {
intent.setType("text/plain");
} else {
intent.setType("application/octet-stream");
}
startActivity(intent);
}
(2) 推广的提醒显示如下图所示其中点击发送短信按钮系统会自动转向到手机的短信发送页面点击邮件转发系统会自动跳转到手机自带的邮箱客户端进行相关信息的转发任务从而实现了智能手机智能的一方面[13]。
在使用手机推广信息的过程中效果如图4.4所示。
图4.4 推广信息的提示
4.2.4 发帖功能的实现
发帖功能也是在用户注册会员并登录系统以后才能进行的操作,如果用户在没有登录的前提下点击发帖按钮,客户端会提醒用户登录否则不予进入发帖的模块。
具体的实现代码如下:
public void onClick(View v) {
switch (v.getId()) {
case R.id.reply_send1:
subject1 = titleMessage.getText().toString().trim();
message = message1.getText().toString().trim() + "\r\r\n" + "手机客户端"; SharedPreferences shar = this.getSharedPreferences("userInfo",
Context.MODE_PRIVATE);
userName = shar.getString("userName", "");
uid = shar.getInt("uid", uid);
if (message == null || subject == null || message.equals("")
|| subject.equals("")) {
} else {
pdialogx.show();
subject1 = insubject + subject1;
if (imagePath == null || imagePath.equals("")) {
hander = new Handler();
new Thread(new Runnable() {
public void run() {
result = WebServiceClient.addForum(
SendMessage.this, uid, userName, fid, tid,
message, subject1);
hander.post(new Runnable() {// post 里面写显示的内容
public void run() {
if (result != null
&& result.equals("success")) {
pdialogx.cancel();
Toast.makeText(SendMessage.this,
"发帖成功", Toast.LENGTH_SHORT)
.show();
finish();
pdialogx.dismiss();
} else {
pdialogx.cancel();
Toast.makeText(SendMessage.this,
"发帖失败", Toast.LENGTH_SHORT)
.show();
pdialogx.dismiss();
}
}
});
}
}).start();
}
case R.id.st_addimage:
LayoutInflater inflater = this.getLayoutInflater();
View layout = inflater.inflate(yout.dialog_item, null);
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选择图片附件");
final TextView takepic = (TextView) layout
.findViewById(R.id.takepic);
final TextView takecamera = (TextView) layout
.findViewById(R.id.takecamera);
final TextView deletepic = (TextView) layout
.findViewById(R.id.deletepic);
builder.setView(layout);
final AlertDialog dilog = builder.show();
takepic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int TAG = 1;
if (android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED)) {
takepic.setBackgroundColor(R.color.blue);
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
dilog.dismiss();
}
}
});
发帖页面如图4.5所示。
图4.5 发帖界面显示效果图
4.2.5 收藏功能的实现
收藏作为方便用户管理自己浏览过的网站相关信息而设计,收藏功能是在android sdk封装的sqlite数据库的基础上实现的,在开发过程当中我把用户浏览过的网页地址用字符串的形式保存到了本地的sqlite数据库中[14],实现的相关代码如下:class Database extends SQLiteOpenHelper {
public Database(Context context) {
super(context, DATABASENAME, null, invertion);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "create table " + TABLENAME + " (" + TableRow.ID
+ " INTEGER PRIMARY KEY, " + TableRow.CONTENT_TEXT
+ " text, " + TableRow.AUTHOR + " text," + TableRow.CLICK
+ " text," + TableRow.REPLAY + " text," + TableRow.URL
+ " text," + TableRow.FLAG + " text);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldV ersion, int newVersion) { db.execSQL("drop table if exist " + TABLENAME);
}
}
public SaveHistoryData open(Context context) {
helper = new Database(context);
database = helper.getWritableDatabase();
return this;
}
public void close() {
helper.close();
database.close();
}
public boolean insert(String content, String author, String click,
String reply, String url, String flag) {
ContentValues values = new ContentValues();
values.put(TableRow.CONTENT_TEXT, content);
values.put(TableRow.AUTHOR, author);
values.put(TableRow.CLICK, click);
values.put(TableRow.REPLAY, reply);
values.put(TableRow.URL, url);
values.put(TableRow.FLAG, flag);
boolean b = database.insert(TABLENAME, null, values) > 0;
this.close();
return b;
}
public boolean getCount(String strContent, String flag) {
String[] strColumns = new String[] { TableRow.AUTHOR };
String[] strWhere = new String[] { strContent, flag };
String strSelection = "content_text=? and flag=?";
Cursor c = database.query(TABLENAME, strColumns, strSelection,
strWhere, null, null, null);
boolean result = c.moveToFirst();
c.close();
return result;
}
public void delete(String tname, String flag) {
String[] strWhere = new String[] { tname, flag };
String strSelection = "content_text=? and flag=?";
database.delete(TABLENAME, strSelection, strWhere);
}
4.2.6 团购功能的实现
团购作为当下流行的一种购物模式在网站客户端中我同样加入了相关团购的模块来模拟团购的一些基本信息,在获取服务器的团购物品图片的过程中采用了异步加载的模式和软引用的缓存图片的方式对图片信息进行优化防止了因为图片占用内存过大而引起的手机内存溢出的问题[15],异步加载实现的相关代码如下:
public class AsyncImageLoader {
private HashMap<String, SoftReference<Bitmap>> imageCache;
public AsyncImageLoader() {
imageCache = new HashMap<String, SoftReference<Bitmap>>();
}
public Bitmap loadDrawable(final String imageUrl,
final ImageCallback imageCallback) {
if (imageCache.containsKey(imageUrl)) {// 出现重复图片
SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
Bitmap drawable = softReference.get();
if (drawable != null) {
return drawable;
}
}
final Handler handler = new Handler() { // 新的图片
public void handleMessage(Message message) {
Log.v("imallllgeUrl", imageUrl);
imageCallback.imageLoaded((Bitmap) message.obj, imageUrl);
}
};
new Thread() {
@Override
public void run() {
Bitmap bt = getBitmap(imageUrl);
imageCache.put(imageUrl, new SoftReference<Bitmap>(bt));
Message message = handler.obtainMessage(0, bt);
handler.sendMessage(message);
}
}.start();
return null;
}
public Bitmap getBitmap(String url) {
Bitmap bt = null;
if (url != null && !url.equals("")) {
InputStream is = null;
try {
URL url1 = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url1
.openConnection();
conn.setDoInput(true);
conn.connect();
is = conn.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; // 图片放缩比例
bt = BitmapFactory.decodeStream(is, null, options);// 防止内存溢出
is.close();
conn.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return bt;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return bt;
}
}
return bt;
}
public interface ImageCallback {
public void imageLoaded(Bitmap imageDrawable, String imageUrl);
}
}
图片通过适配器加载到页面上显示的相关代码如下:
class TuangouAdapter extends BaseAdapter {
List<TuangouComment> list;
private Drawable drawable;
private Context context;
LayoutInflater layoutInflater;
AsyncImageLoader asyncImageLoader;
private Handler hander;
ListView listview;
public TuangouAdapter(List<TuangouComment> list, Context context, ListView listview) {
this.listview = listview;
this.list = list;
this.context = context;
layoutInflater = LayoutInflater.from(context);
asyncImageLoader = new AsyncImageLoader();
}
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
public TuangouComment getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub
ItemHoder item = null;
final TuangouComment tuangouComment = getItem(position);
if (convertView == null || convertView.getTag() == null) {
item = new ItemHoder();
convertView = layoutInflater.inflate(yout.tuangou_item, null);
item.content = (TextView) convertView
.findViewById(R.id.tuan_content_text);
item.author = (TextView) convertView
.findViewById(R.id.tuan_autor_text);
item.clickcount = (TextView) convertView
.findViewById(R.id.tuan_clickcount_text);
item.replaycount = (TextView) convertView
.findViewById(R.id.tuan_replycount_text);
} else {
item = (ItemHoder) convertView.getTag();
}
在android中数据访问时通过Url的定向来获取相关数据,因此android的图片一方面是可以直接从网络获取,另一方面是根据图片的缓存机制来获取相关图片二进制信息,在本系统中我们采取用缓存存取使用过的图片,对未使用的图片采取网络加载的形式这样不仅为用户节省了流量的开销同时为用户代码了图片快速加载的体验[16]。
其中实现代码如下。
String imageUrl = "/" + url;
item.ditalphoto.setTag(imageUrl);
Bitmap bt = asyncImageLoader.loadDrawable(imageUrl,
new ImageCallback() {
public void imageLoaded(Bitmap imageDrawable,
String imageUrl) {。