Android豆瓣图书查询Demo
原文出自:方杰| http://fangjie.info/?p=26 转载请注明出处
首先先看一下Demo预览效果吧,主要也就是两个Activity。涉及到的技术有zxing开源项目的使用,网络协议豆瓣API的调用,JSON数据的解析,多线程以及Handler的使用,还有Intent传递Object对象的方式。


看下项目的组织框架。MainActivity,BookView分别是两个界面的Activity,BookInfo是书籍信息的类,Util就是一些工具类,有解析JSON数据的方法,下载图书信息的方法之类的。下面google.zxing.integeration.android包中的内容是完全引入zxing开源项目的东西。

一.Zxing类库的使用。https://code.google.com/p/zxing/
1.首先安装Zxing的apk。
2.下载两个接口文件,IntentIntegrator.java,IntentResult.java 文件,当时在网上找了半天都下不下来。这里给大家共享了!http://files.cnblogs.com/itstudent/zxing.zip
3.Zxing的使用
//开始调用:
IntentIntegrator integrator=new IntentIntegrator(MainActivity.this);
integrator.initiateScan();
//然后复写onActivityResult这个方法:
public void onActivityResult(int requestCode,int resultCode,Intent data)
{
IntentResult result=IntentIntegrator.parseActivityResult(requestCode,resultCode,data);
//result即为扫描结果,result.getContents() 返回图书的ISBN码。
}
二.启用下载线程下载,解析图书信息
得到ISBN码后就可以获取图书的信息了,这里为了避免下载过程中导致UI主界面阻塞,所以我们新起一个下载线程来下载,获取图书资料信息。
private class DownloadThread extends Thread
{
String url=null;
public DownloadThread(String urlstr)
{
url=urlstr;
}
public void run()
{
String result=Util.Download(url);
BookInfo book=new Util().parseBookInfo(result);
//给主线程UI界面发消息,提醒下载信息,解析信息完毕
Message msg=Message.obtain();
msg.obj=book;
hd.sendMessage(msg);
}
}
在这里就提到了Util类中的两个主要方法:
(1)public static String Download(String urlstr)
public static String Download(String urlstr)
{
String result="";
try{
URL url=new URL(urlstr);
URLConnection connection =url.openConnection();
String line;
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
while ((line = in.readLine()) != null) {
result += line;
}
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
(2) public BookInfo parseBookInfo(String str)
豆瓣API链接地址:https://api.douban.com/v2/book/isbn/编号
因为豆瓣返回的JSON数据形式是这样的:
{
“titile”:"",
"image":"http:\/\/",
"author":["",""],
…..
}
仔细看下可以知道返回的数据形式除了image,author,其他的都是字符串类型,很容易拿到。
但是image返回的是图片链接的形式,所以需要 public Bitmap DownloadBitmap(String bmurl)方法获取Bitmap,
而author这个数据返回的是JSONArray类型,所以需要 public String parseJSONArraytoString (JSONArray arr)将字符串数组解析成字符串。
public BookInfo parseBookInfo(String str)
{
BookInfo info=new BookInfo();
try{
JSONObject mess=new JSONObject(str);
info.setTitle(mess.getString("title"));
info.setBitmap(DownloadBitmap(mess.getString("image")));
info.setAuthor(parseJSONArraytoString(mess.getJSONArray("author")));
info.setPublisher(mess.getString("publisher"));
info.setPublishDate(mess.getString("pubdate"));
info.setISBN(mess.getString("isbn13"));
info.setSummary(mess.getString("summary"));
}catch (Exception e) {
e.printStackTrace();
}
return info;
}
public Bitmap DownloadBitmap(String bmurl)
{
Bitmap bm=null;
InputStream is =null;
BufferedInputStream bis=null;
try{
URL url=new URL(bmurl);
URLConnection connection=url.openConnection();
bis=new BufferedInputStream(connection.getInputStream());
bm= BitmapFactory.decodeStream(bis);
}catch (Exception e){
e.printStackTrace();
}
finally {
try {
if(bis!=null)
bis.close();
if (is!=null)
is.close();
}catch (Exception e){
e.printStackTrace();
}
}
return bm;
}
public String parseJSONArraytoString (JSONArray arr)
{
StringBuffer str =new StringBuffer();
for(int i=0;i<arr.length();i++)
{
try{
str=str.append(arr.getString(i)).append(" ");
}catch (Exception e){
e.printStackTrace();
}
}
return str.toString();
}
}
(3)从下载线程中得到返回的BookInfo数据之后,必须要通过Handler发送个UI主线程中。
UI主线程中:
hd=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
BookInfo book= (BookInfo)msg.obj;
//进度条消失
mpd.dismiss();
Intent intent=new Intent(MainActivity.this,BookView.class);
intent.putExtra(BookInfo.class.getName(),book);
startActivity(intent);
}
};
下载线程中(下载解析完毕后):
Message msg=Message.obtain();
msg.obj=book;
hd.sendMessage(msg);
(4)Intent发送Object对象在MainActivity中得到了Handler返回的BookInfo还需要通过Intent传递给BookView界面上显示出来。所以就涉及到Intent传递Object对象的问题。有两种方式:一是传递的对象需要实现Serializable接口,另一种是实现Parcelable接口。
这里采用的是方式二:
实现Parcelable接口要实现他的三个方法。
public class BookInfo implements Parcelable
{
public static final Parcelable.Creator<BookInfo> CREATOR = new Creator<BookInfo>() {
public BookInfo createFromParcel(Parcel source) {
BookInfo bookInfo = new BookInfo();
bookInfo.mTitle = source.readString();
bookInfo.mBitmap = source.readParcelable(Bitmap.class.getClassLoader());
bookInfo.mAuthor = source.readString();
bookInfo.mPublisher = source.readString();
bookInfo.mPublishDate = source.readString();
bookInfo.mISBN = source.readString();
bookInfo.mSummary = source.readString();
return bookInfo;
}
public BookInfo[] newArray(int size) {
return new BookInfo[size];
}
};
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mTitle);
dest.writeParcelable(mBitmap, flags);
dest.writeString(mAuthor);
dest.writeString(mPublisher);
dest.writeString(mPublishDate);
dest.writeString(mISBN);
dest.writeString(mSummary);
}
}
//然后直接使用Intent发送:
Intent intent=new Intent(MainActivity.this,BookView.class);
intent.putExtra(BookInfo.class.getName(),book);
startActivity(intent);
//最后在BookView中这样得到这个BookInfo:
intent=getIntent();
BookInfo book=(BookInfo)intent.getParcelableExtra(BookInfo.class.getName())
豆瓣扫书Demo:下载
Android豆瓣图书查询Demo的更多相关文章
- 微信小程序demo豆瓣图书
最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...
- 微信小程序之小豆瓣图书
最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...
- python系列之(3)爬取豆瓣图书数据
上次介绍了beautifulsoup的使用,那就来进行运用下吧.本篇将主要介绍通过爬取豆瓣图书的信息,存储到sqlite数据库进行分析. 1.sqlite SQLite是一个进程内的库,实现了自给自足 ...
- 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例
基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...
- 【Python数据分析】Python3操作Excel-以豆瓣图书Top250为例
本文利用Python3爬虫抓取豆瓣图书Top250,并利用xlwt模块将其存储至excel文件,图片下载到相应目录.旨在进行更多的爬虫实践练习以及模块学习. 工具 1.Python 3.5 2.Bea ...
- IOS CoreData 多表查询demo解析
在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...
- vue实现图书管理demo
年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...
- Python个人项目--豆瓣图书个性化推荐
项目名称: 豆瓣图书个性化推荐 需求简述:从给定的豆瓣用户名中,获取该用户所有豆瓣好友列表,从豆瓣好友中找出他们读过的且评分5星的图书,如果同一本书被不同的好友评5星,评分人数越多推荐度越高. 输入: ...
- requests+正则爬取豆瓣图书
#requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...
随机推荐
- struts2在web.xml中配置详情
web.xml是web应用中载入有关servlet信息的重要配置文件,起着初始化servlet,filter等web程序的作用. 通常,全部的MVC框架都须要Web应用载入一个核心控制器.那採取什么方 ...
- poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...
- MySQL-视频跟随练习笔记
在表中添加某列 alter table tbl_user add email varchar(50); 在表中删除某列 alter table tbl_user drop email; 重命名某列 a ...
- nyoj 37
//nyoj 37 代码有点乱,和最长公共子序列很像,只是多加了一个数组,之前调用函数, 一直超时,可是我看了下,为什么用一个整形数组存放倒置字符串 竟然可以AC,我测试了下数据,打印出来的是一串地 ...
- WCF代理是怎么工作的?用代码说话
1.WCF生成代理的方式 2.WCF代理原理 第一个问题引用 一篇Robin's博文[WCF生成客户端对象方式解析] 讲述了创建客户端服务对象的方法 1.代理构造法 a.开启服务后,添加服务引用 b. ...
- axure RP Pro7.0加载日历控件的步骤
- Android开发手记(12) Menu的使用
Android中的Menu分为三种,分别为:OptionsMenu(选项菜单).ContextMenu(上下文菜单).SubMenu(子菜单). 1.OptionsMenu 按Menu键就会显示,用于 ...
- VS2010发布网站的基本步骤
1.首先建一个空文件夹,用来存放发布的程序:例如:WebTest 2.然后打开IIS--->右击--->添加网站,如下图所示: 图 1-1 ...
- 本地连接速度100.0mbps变10.0mbps如何恢复
右键我的电脑--管理---设备管理器--网络适配器展开,可以看到网卡,右击属性--高级--连接速度和双工模式或(LINK SPEED)选项,选择100就好了 那么我们在选择的时候会有100M全双工 ...
- iOS9.3 Could not find Developer Disk Image 真机调试错误解决办法
昨天手机系统升级9.3,到了公司真机测试的时候发现Xcode(7.2.1)报错:Could not find Developer Disk Image , 这是因为我的Xcode7.2中还没有支持9. ...