Android豆瓣图书查询Demo

首先先看一下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());
分类: Android

更多相关文章

  1. android:webView总结
  2. Android(安卓)Studio快捷键汇总
  3. android创建菜单
  4. Android(安卓)中的观察者模式Observer
  5. Android(安卓)Notification 详解
  6. 配置android app 方法数超过65k问题
  7. 关于Android(安卓)Studio打包混淆以及上传mapping文件
  8. 获取Android(安卓)SDK 源代码并在Eclipse中关联查看的方法
  9. Android(安卓)数据存储ContentProvider(类容提供者)之对外提供数据

随机推荐

  1. Android-->build.gradle-->buildTypes
  2. JNI在Android中的简单使用
  3. 2011.07.08——— android n获得壁纸
  4. Android 软键盘那点事
  5. Android删除指定文件夹下所有、删除指定
  6. android Theme
  7. Android计算器界面布局
  8. Android浏览器如何打开网页
  9. 改变ScrollView的滚动条的颜色
  10. Android(安卓)之WebView