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)学习笔记149:利用开源SmartImageView优化网易新闻RSS客户端的更多相关文章

  1. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  2. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  3. Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  4. Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]

    /*********数据的输入********//**利用扫描仪Scanner进行数据输入 怎么使用扫描仪Scanner *1.放在类声明之前,引入扫描仪 import java.util.Scann ...

  5. Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

    1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...

  6. Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

    1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高 ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  9. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

随机推荐

  1. python中panda的dateframe

    1 函数介绍 #to_csv函数的语法#函数原型# to_csv(filepath,sep=",",index=TRUE,header=TRUE)#参数介绍: #(1)导出的文件路 ...

  2. Flutter实战视频-移动电商-41.详细页_数据接口的调试

    41.详细页_数据接口的调试 建立数据模型层,我们的业务逻辑分开,然后进行后台数据的调试 生成model类 json数据: { ", "message": "s ...

  3. jQuery 字母大小写转换

    "ABC".toLowerCase()//转小写 "abc".toUpperCase()//转大写

  4. Codeforces764C【DFS】

    前言,根据最终图的样貌搞真厉害 "缩点判根度为结点数-1"牛逼 ----- 题意: 找一个根使得不带根的所有子树内部颜色都相同: 思路: 如果存在两个颜色不一样的连在一起,根就是他 ...

  5. HihoCoder 1121二分图一•二分图判定

    背景: 个名字,表示这两个人有一场相亲.由于姑姑年龄比较大了记性不是太好,加上相亲的人很多,所以姑姑一时也想不起来其中有些人的性别.因此她拜托我检查一下相亲表里面有没有错误的记录,即是否把两个同性安排 ...

  6. 51nod 1297

    思路: 搞个栈模拟一下,也才5w; 直接wa1了..然后想到井口如果都进不去那就...一定GG了. 所以维护一下从井口到井底是非递增的就好了: #include <cstdio> #inc ...

  7. XHTML学习笔记 Part3:核心属性

    1. 3个属性组: 核心属性:class.id 和title属性 国际化属性:dir.lang和xml:lang属性 UI事件:与如下事件关联的属性: onclick.ondoubleclick.on ...

  8. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  9. ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤

    ZROI #365. [2018普转提day18专题]嘤嘤嘤嘤 直接放代码 具体做法见注释 #include<stdio.h> #include<cstring> #inclu ...

  10. 洛谷 P4549 【模板】裴蜀定理

    https://www.luogu.org/problemnew/show/P4549 (1)证明方程ax+by=gcd(a,b)(a,b为常数;a>0,b>0;a,b,x,y为整数)有解 ...