Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的
国内我们经常用到https://github.com/ 或者 http://code.google.org/ (但是google在中国屏蔽很厉害),暂时我们可以使用http://code.taobao.org(淘宝开源项目)
2.我们登录 https://github.com/ :搜索 smart image view,如下:
我们选择开源项目通常都是选择使用者数量最多的,因为使用者越多,项目本身就越完善(很多人修复升级项目,再发布出来);
这里我们就是选择第一个:loopj/android-smart-image-view,如下:
3.下载项目代码到本地PC上,如下:
解压之后文件内部如下:
我们需要的代码就在src文件下,进入src内部如下:
复制整个com文件夹内容 到 我们之间编写的Android(java)学习笔记205中网易新闻客户端,如下:
4.优化程序代码如下:
(1)进入item.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- <com.loopj.android.image.SmartImageView //改成新的SmartImageView的全路径:com.loopj.android.image.SmartImageView
- android:id="@+id/iv_item"
- android:layout_width="100dip"
- android:layout_height="80dip" />
- <TextView
- android:id="@+id/tv_item_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dip"
- android:layout_marginTop="5dip"
- android:layout_toRightOf="@id/iv_item"
- android:singleLine="true"
- android:text="我是标题"
- android:textColor="#000000"
- android:textSize="19sp" />
- <TextView
- android:id="@+id/tv_item_desc"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/tv_item_title"
- android:layout_marginLeft="5dip"
- android:layout_marginTop="1dip"
- android:layout_toRightOf="@id/iv_item"
- android:lines="2"
- android:text="我是描述,我们都是好孩子"
- android:textColor="#AA000000"
- android:textSize="14sp" />
- <TextView
- android:id="@+id/tv_item_type"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="2dip"
- android:layout_alignParentRight="true"
- android:layout_below="@id/tv_item_desc"
- android:background="#ff0000"
- android:text="直播" />
- </RelativeLayout>
(2)进入MainActivity.java中,SmartImageView导入包也要变化,由之前的com.himi.news.ui 换成为 com.loopj.android.image :
(3)修改SmartImageView代码块;
- package com.himi.news;
- import java.util.List;
- import android.app.Activity;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- import com.himi.news.domain.NewsItem;
- import com.himi.news.net.NewsUtils;
- import com.loopj.android.image.SmartImageView;
- public class MainActivity extends Activity {
- protected static final int SUCCESS = 0;
- protected static final int ERROR = 1;
- private ListView lv;
- private Handler handler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case SUCCESS:
- lv.setAdapter(new NewsAdapter());
- break;
- case ERROR:
- Toast.makeText(MainActivity.this, "请求失败,获取失败", 0).show();
- break;
- }
- };
- };
- /**
- * 所有的新闻信息
- */
- private List<NewsItem> newsItems;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- lv = (ListView)findViewById(R.id.lv);
- new Thread() {
- public void run() {
- try {
- newsItems = NewsUtils.getAllNews(MainActivity.this);
- Message msg = Message.obtain();
- msg.what = SUCCESS;
- handler.sendMessage(msg);
- } catch (Exception e) {
- // TODO 自动生成的 catch 块
- e.printStackTrace();
- Message msg = Message.obtain();
- msg.what = ERROR;
- handler.sendMessage(msg);
- }
- };
- }.start();
- }
- private class NewsAdapter extends BaseAdapter {
- public int getCount() {
- return newsItems.size();
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- View view ;
- if(convertView == null) {
- view = View.inflate(MainActivity.this, R.layout.item, null);
- }else {
- view = convertView;
- }
- SmartImageView iv = (SmartImageView) view.findViewById(R.id.iv_item);
- TextView tv_title = (TextView) view.findViewById(R.id.tv_item_title);
- TextView tv_desc = (TextView) view.findViewById(R.id.tv_item_desc);
- TextView tv_type = (TextView) view.findViewById(R.id.tv_item_type);
- NewsItem item = newsItems.get(position);
- //iv.setImageUrl(item.getImage());
- /**
- * 开源项目SmartImageView的方法:public void setImageUrl(String url, final Integer fallbackResource):
- * 获取对应Url路径下的图片资源,如果无法获取或者获取失败,就会返回fallbackResource,这里我们设置为图片资源R.drawable.error
- */
- iv.setImageUrl(item.getImage(), R.drawable.error);
- tv_title.setText(item.getTitle());
- tv_desc.setText(item.getDesc());
- int type = item.getType();
- if(type==1) {
- tv_type.setText("评论:"+item.getComment());
- }else if(type==2) {
- tv_type.setText("直播");
- tv_type.setBackgroundColor(Color.RED);
- }else if(type==3) {
- tv_type.setText("视频");
- tv_type.setBackgroundColor(Color.BLUE);
- }
- return view;
- }
- public Object getItem(int position) {
- return null;
- }
- public long getItemId(int position) {
- return 0;
- }
- }
- }
(4)这时候再次布署程序到模拟器上,如下:
(5)接下来我们模拟出一个场景,就是获取网络图片的路径出错,是不是会出现类似"加载失败"的页面;
首先我们在PC端Web服务器Apache的安装目录下的htdocs文件夹下,找到并且打开news.xml,如下:
将第一条新闻的 <image>标签指引图片路径:
由原来的 <image>http://49.123.72.40/img/a.jpg</image> 改成 <image>http://49.123.72.40/img/aa.jpg</image>
这里应该是网易新闻客户端是访问不到这个图片的,模拟器程序退出重新进入,效果如下:
当我们把路径改回去 <image>http://49.123.72.40/img/a.jpg</image>,模拟器程序退出重新进入,效果如下:
(6)与此同时,我们下次网易新闻客户端 再次访问这个news.xml文件的时候,就会从缓冲里面取,如下:
/data/data/com.himi.news/cache/web_image_cache:
这里的web_image_cache文件下的4个文件就是每条新闻的缓存文件,下次应用程序再次访问这个网页news.xml的时候,程序就会从本地缓存取数据,这样就速度更快,这也是真实的PC浏览器和手机浏览器浏览网页逻辑。
这里我们的开源项目已经全部实现这些缓存还有其他的功能,我们只要知道如何使用就行。
Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端的更多相关文章
- Android(java)学习笔记149:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...
- Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]
/*********数据的输入********//**利用扫描仪Scanner进行数据输入 怎么使用扫描仪Scanner *1.放在类声明之前,引入扫描仪 import java.util.Scann ...
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...
- Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
随机推荐
- Android Learning:数据存储方案归纳与总结
前言 最近在学习<第一行android代码>和<疯狂android讲义>,我的感触是Android应用的本质其实就是数据的处理,包括数据的接收,存储,处理以及显示,我想针对这几 ...
- Flex时间操作
小弟是Flex新手,最近一段时间领导要求使用Flex开发B/S的一些项目,需要用到时间上的一些操作.上网查询一番好多人都说不好操作,有的甚至非常麻烦.基于此,小弟整理了一些关于Flex时间操作的经验, ...
- 最牛「CSRF防护」,带你进入大虾们的圈子!
简单理解 CSRF 什么是 CSRF? CSRF,通常称为跨站请求伪造,英文名 Cross-site request forgery 缩写 CSRF,是一种对网站的恶意攻击.一个跨站请求伪造攻击迫使登 ...
- 【BZOJ1036】 树的统计Count (树链剖分)
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
- css li 列表
ul,li{list-style-type:none;padding:0;margin:0}
- HBase学习笔记之HFile格式
主要看Roger的文档,这里作为文档的补充 HFile的格式-HFile的基本结构 Trailer通过指针找到Meta index.Data index.File info. Meta index保存 ...
- 坑爹的Android Ble 问题记录日志
开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...
- Java FutureTask理解
尊敬原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8956703 FutureTask是为了弥补Thread的不足而设计的,它可以 ...
- 【HDOJ】5203 Rikka with wood sticks
/* 1002 */ #include <iostream> #include <string> #include <map> #include <queue ...
- 大数A-B
还没写过大数减法,今天比赛还WA了两次... #include<iostream> #include<string> using namespace std; void sub ...