原文出自:方杰| 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的更多相关文章

  1. 微信小程序demo豆瓣图书

    最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...

  2. 微信小程序之小豆瓣图书

    最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...

  3. python系列之(3)爬取豆瓣图书数据

    上次介绍了beautifulsoup的使用,那就来进行运用下吧.本篇将主要介绍通过爬取豆瓣图书的信息,存储到sqlite数据库进行分析. 1.sqlite SQLite是一个进程内的库,实现了自给自足 ...

  4. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

  5. 【Python数据分析】Python3操作Excel-以豆瓣图书Top250为例

    本文利用Python3爬虫抓取豆瓣图书Top250,并利用xlwt模块将其存储至excel文件,图片下载到相应目录.旨在进行更多的爬虫实践练习以及模块学习. 工具 1.Python 3.5 2.Bea ...

  6. IOS CoreData 多表查询demo解析

    在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...

  7. vue实现图书管理demo

    年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...

  8. Python个人项目--豆瓣图书个性化推荐

    项目名称: 豆瓣图书个性化推荐 需求简述:从给定的豆瓣用户名中,获取该用户所有豆瓣好友列表,从豆瓣好友中找出他们读过的且评分5星的图书,如果同一本书被不同的好友评5星,评分人数越多推荐度越高. 输入: ...

  9. requests+正则爬取豆瓣图书

    #requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...

随机推荐

  1. 与useradd命令相关的两个默认配置文件

      Configuration Files for User Management Defaults   When working with tools as useradd, some defaul ...

  2. sass笔记-4|像写脚本一样写Sass,把能交给Sass办的都交给它

    Sass笔记关于sass的基础部分已经写完,这一篇介绍Sass的高级特性--脚本特性.Sass能做很多事让样式表更智能,我们先会看到Sass眼中的数据类型,在这些数据类型上会有可进行的操作,此外,Sa ...

  3. HDU -2674 N!Again(小技巧)

    这道题有个小技巧,就是既然是n!,那么对2009求余,只要大于2009!,那么一定是0,在仔细想想会发现,根本到不了2009,只要到2009的最大质因数就行了,为什么呢?因为最大质因数是最大的一个不能 ...

  4. phpmyadmin设置id自增(AUTO_INCREMENT)(转)

    phpmyadmin设置id自增(AUTO_INCREMENT)   在A_I 前面打勾:如图 AUTO_INCREMENT =A_I 查看效果  

  5. HTML5 microdata

    schema.org 测试地址 http://www.google.com/webmasters/tools/richsnippets

  6. rest简单实例

    http://www.cnblogs.com/fredric/archive/2012/03/03/2378680.html http://www.thinksaas.cn/topics/0/153/ ...

  7. sql server备份相关

    本文转载自http://dreamfire.blog.51cto.com/418026/152075/ 感谢作者的分享!!   数据库没有备份---应如何还原丢失的数据   环境描述: 某公司装了一台 ...

  8. 1.1 语言与平台 [Java]

    Java语言是静态类型.面向对象的语言: Java平台是提供运行时环境的软件: 生产和使用Java代码的整个过程:.java (javac) .class (类加载器) 转换后的.class (解释器 ...

  9. PHPCMS V9二次开发]自定义字段模型-文本组

    phpcms v9,我们在做类似于酒店房型等类型的时候,需要用到文本组字段模型,但phpcms并未提供该模型.如下图所示效果: 展示效果如下: 步骤/方法 打开phpcms\modules\conte ...

  10. PHP防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...