Android豆瓣图书查询Demo

15 篇文章 0 订阅


首先先看一下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())
http://www.cnblogs.com/itstudent/p/3186061.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值