原文出自:方杰| 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:下载

最新文章

  1. TFFS格式化到创建成功过程
  2. Web客户端数据存储学习笔记——Cookie
  3. 创建js对象的属性和方法
  4. Git学习笔记(2)——版本的回退,和暂存区的理解
  5. ssh架构简单解释和vo po解释
  6. [ActionScript 3.0] AS3 绘制正二十面体(线条)
  7. Smarty插件简单开发
  8. Hadoop与分布式开发
  9. 知识管理(knowledge Management)2
  10. h.264 mvp求解过程
  11. WPF笔记(1.2 Navigation导航)——Hello,WPF!
  12. 《Windows驱动开发技术详解》之自定义StartIO
  13. vscode编译发布exe
  14. 《用Python写爬虫》学习笔记(一)
  15. react组件开发规范总结
  16. 14.swing
  17. gitlab备份、恢复、升级
  18. Java DES 加解密(&quot;DES/CBC/PKCS5Padding&quot;)
  19. C# 自定义文件格式并即时刷新注册表 非关闭explorer
  20. C#基础之反射

热门文章

  1. android改动tab 导航 指示器颜色
  2. Appcelerator Titanium 3.x Win7 64位平台安装步骤
  3. Cobar是提供关系型数据库(MySQL)分布式服务的中间件
  4. 苹果Swift编程语言新手教程【中国版】
  5. [转] 使用Spring Boot和Gradle创建项目
  6. INFORMATION_SCHEMA.COLUMNS 查询表字段语句
  7. sae storage 使用uploadify插件进行文件批量上传
  8. SpringMVC07处理器方法的返回值
  9. css10定位属性
  10. 网页JavaScript3