中国水系Android第一个版本
写这个例子的目的是供同事和开发Android的朋友学习借鉴。
这个版本不是凭空冒出来的,就像爱因斯坦做手工的故事(不知道的见这里)一样,还有更丑的“小凳子”,它们是:
- 简单使用SimpleCursorAdapter
- 在视图显示中使用Style
- 在视图显示中使用Theme
- android 1.6下使用Loader示例
参考它们可以了解版本的演进过程。可能降低学习曲线。
这个版本的首页:
点击条目,会弹出带图片的详细信息界面:
这里的图片是从维基百科直接下载的,并会缓存在本地。
另外,就是对横竖屏使用了不同的布局:
下面介绍一下实现的要点。
异步延时加载的处理
以前我都是自己写异步加载,比如用Java concurrent编写异步加载图片功能和android异步加载ListView中的图片。其实android自己有个AsyncTask,可以方便的做这个事情。这次尝试使用了一下。
我目前的基本理解是AsyncTask简化了异步开发。
因为如果自己写,需要创建线程执行后台操作,比如下载图片文件,然后还是要通过handler通知ui线程将图片文件显示到界面上。
AsyncTask提供了需要实现的方法,一些方法AsyncTask会创建线程执行,比如doInBackground,而onPostExecute方法,AsyncTask会自行调用handler通知ui线程执行。
这部分代码见DetailViewActivity的内部类:
private class ShowImageTask extends AsyncTask<String, Void, Void> {
private String fileName;
@Override
protected Void doInBackground(String… params) {
fileName = params[1] + ".jpg";File cacheFile = new File(getCacheDir(), fileName);
if (!cacheFile.exists()) {
//创建临时文件,用于下载图片使用
File tempFile = new File(getCacheDir(), "tmp");
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(params[0]);
try {
HttpResponse response = client.execute(get);
FileOutputStream outputStream = new FileOutputStream(
tempFile);
InputStream inputStream = response.getEntity().getContent();
for (int i = inputStream.read(); i != -1; i = inputStream
.read()) {
outputStream.write(i);
}
inputStream.close();
outputStream.close();
/**
* 改名临时文件,改为对应河流id的jpg文件
* 这样做是为了防止图片下载不全的问题
*/
tempFile.renameTo(cacheFile);
} catch (Exception e) {
throw new RuntimeException(e);
}
}return null;
}@Override
protected void onPostExecute(Void result) {
try {
imageView.setImageDrawable(Drawable.createFromStream(
new FileInputStream(new File(getCacheDir(), fileName)),
"river.jpg"));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
imageLoadProgressBar.setVisibility(View.GONE);
}
这里还需要注意的是,使用了httpclient api来下载图片,这部分如果不明白,可参见更简单的示例android编写访问http的代码。只不过这里是使字节流。
下载的图片放在哪里?这里没有选择放在sd卡这样的外存中,而是放在内存里。内存可存储在两个位置:
- 存放在应用的files目录下,不过不能直接操作目录,只能通过openFileOutput()操作文件流,当不存在的时候自动创建
- 存放在应用的cache目录下,可操作文件目录,通过getCacheDir()方法可获取目录File对象
在这里使用cache目录的方式,因为要操作文件并且涉及到文件改名等。
有关Content Provider和数据库
示例使用了Content Provider,而且是:
sqlite+Content Provider+CursorAdapter+Loader+ListView
示例中详细界面是Activity,设置了dialog的theme,看上去像对话框。这样做的考虑是结构简单,两个Activity是通过intent来松散耦合的。在intent中传递的是river的id。
这样,content provider需要能处理对集合的查询和对指定id的查询:
switch (uriMatcher.match(uri)) {//判断是访问river集合还是指定id访问单条记录
case ITEMS:
cursor = database.query("rivers", projection, selection,
selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
case ITEM:
cursor = database.query("rivers", projection, _ID + "="
+ uri.getPathSegments().get(1), selectionArgs, null, null,
sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
default:
throw new IllegalArgumentException("unknown uri: " + uri);
}
横竖屏的处理
这个处理其实很简单。基本思路是针对横竖屏有不同的布局文件,android会在配置变化自动识别并加载对应文件。
如图所示,可知目录的命名方法。
源代码见:
http://easymorse.googlecode.com/svn/tags/CustomListViewDemo-0.5.1/
中国水系Android第一个版本相关推荐
- 中国市场Android终端App兼容性质量报告
由于Google的开放策略,越来越多的终端厂商甚至互联网企业加入到手机终端商的领域,迅速加剧了Android移动终端的碎片化,但随之而来基于Android的移动App产品因为智能终端不能正常安装.意外 ...
- 中国医疗AI第一股首位投资人:AI不再高深,正在回归商业本质
杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 中国医疗AI第一股,已经敲钟落定! 2021年11月5日,鹰瞳科技Airdoc正式在港交所上市,开盘价67.6港元,当日市值超过72亿港元. ...
- .net程序员转战android第一篇---环境部署
对于.net开发人员去写java,可谓说是见山是山, 因为太多的相同; 最近段时间因工作因素,将项目中部分功能需要移植到android平台上,经过半个月的煎熬,终于搞完了. 文章中将直观记录我做项目中 ...
- 如何做一个新产品的第一个版本:关于MVP和上线时间的权衡
为什么第一个版本要是MVP?为啥要梳理MVP?书里(<精益创业>)告诉你,你需要用一个最小可行性的模型去验证需求.用最小的代价去验证用户是否买账,就算是验证出来是伪需求,也方便及时调整方向 ...
- android 主要哪些版本,你用过的最早的安卓版本是哪个?带你见识最早的安卓系统!...
原标题:你用过的最早的安卓版本是哪个?带你见识最早的安卓系统! 随着Android版本更新的迭代,许多人现在使用Android 7.1版甚至8.0版.但你还记得你接触过多少最早的安卓版本吗?对于许多经 ...
- android 系统(143)---Android实现App版本自动更新
Android实现App版本自动更新 现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器 ...
- Android build.gradle文件详解(转述自《Android第一行代码》第二版)
Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...
- 说说android下TV版本UC浏览器模拟鼠标的实现
说说android下TV版本UC浏览器模拟鼠标的实现 无意中下载了一个TV版本的UC浏览器安装到机顶盒上,顺便体验了一把.感觉吗还行,原先以为UC浏览器会针对Android下TV的遥控器操作 ...
- Android系统和版本介绍
Android系统的发展 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.Android操作系统最 ...
- 切图iOS和android区别,用sketch也要画iOS和android两套吗|Sketch如何用一套设计稿做iOS和Android两个版本 - PS下...
很多Sketch 新手刚进入接触UI设计的时候,不知道如何用一套设计稿来处理IOP和安卓两个系统的图,那么如何用一套设计稿较快速地做 iOS 和 Android 两个版本 app?是不是要做两套呢?然 ...
最新文章
- API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
- PMCAFF|产品经理必须懂得的五大心理学分支
- AI理论知识整理(1)-数列(1)
- python string 方法,python字符串的方法与操作大全
- oracle优质图书,经典Oracle图书推荐(之四)_oracle
- django model Meta选项
- Java笔记-2种发送接收表单的数据
- mysql 新增返回主键自增id_详解mysql插入数据后返回自增ID的七种方法
- iOS版本更新与集成百度地图
- MATLAB如何调用百度云文字识别API
- 51智联等已成“厕所”,猎聘网建“会所”求突破
- 怎么去掉WIN7窗口文本框中淡绿色的底色
- 在单面打印机上使用WPS实现手工双面打印
- 虚拟服务器黑屏怎么办,解决VMware 虚拟机开机黑屏的问题
- 2019智能手表推荐_2020年买什么智能手表合适?
- 永信至诚助“海南省首届网络安全大赛”决赛圆满收官
- 移植Linux 3.4.2内核到JZ2440开发板(超精讲)
- python api讲解_集合api讲解_Python C编程视频课程_Python视频-51CTO学院
- 强大的刻盘软件 Ashampoo Burning Studio 9.20 中文版 + 注册码下载
- 详解新网银木马清除技巧