《word 第一行消失代码》的最后一章酷欧天气,到第二阶段“正在加载”一直出现消失出现的闪,有做过的吗,指教一下

《第一行代码》目录-android100学习网
《第一行代码》目录
图书目录:第1章 开始启程,你的第一行Android代码 1.1 了解全貌,Android王国简介 1.1.1 Android系统架构 1.1.2 Android已发布的版本 
图书目录:
第1章 开始启程,你的第一行Android代码 
1.1 了解全貌,Android王国简介 
1.1.1 Android系统架构 
1.1.2 Android已发布的版本 
1.1.3 Android应用开发特色 
1.2 手把手带你搭建开发环境 
1.2.1 准备所需要的软件 
1.2.2 搭建开发环境 
1.3 创建你的第一个Android项目 
1.3.1 创建HelloWorld项目 
1.3.2 运行HelloWorld 
1.3.3 分析你的第一个Android程序 
1.3.4 详解项目中的资源 
1.4 前行必备,掌握日志工具的使用 
1.4.1 添加LogCat到你的Eclipse 
1.4.2 使用Android的日志工具Log 
1.4.3 为什么使用Log而不使用System.out 
1.5 小结与点评 
第2章 先从看得到的入手,探究活动 
2.1 活动是什么 
2.2 活动的基本用法 
2.2.1 手动创建活动 
2.2.2 创建和加载布局 
2.2.3 在AndroidManifest文件中注册 
2.2.4 隐藏标题栏 
2.2.5 在活动中使用Toast 
2.2.6 在活动中使用Menu 
2.2.7 销毁一个活动 
2.3 使用Intent在活动之间穿梭 
2.3.1 使用显式Intent 
2.3.2 使用隐式Intent 
2.3.3 更多隐式Intent的用法 
2.3.4 向下一个活动传递数据 
2.3.5 返回数据给上一个活动 
2.4 活动的生命周期 
2.4.1 返回栈 
2.4.2 活动状态 
2.4.3 活动的生存期 
2.4.4 体验活动的生命周期 
2.4.5 活动被回收了怎么办 
2.5 活动的启动模式 
2.5.1 standard 
2.5.2 singleTop 
2.5.3 singleTask 
2.5.4 singleInstance 
2.6 活动的最佳实践 
2.6.1 知晓当前是在哪一个活动 
2.6.2 随时随地退出程序 
2.6.3 启动活动的最佳写法 
2.7 小结与点评 
第3章 软件也要拼脸蛋,UI开发的点点滴滴 
3.1 该如何编写程序界面 
3.2 常见控件的使用方法 
3.2.1 TextView 
3.2.2 Button 
3.2.3 EditText 
3.2.4 ImageView 
3.2.5 ProgressBar 
3.2.6 AlertDialog 
3.2.7 ProgressDialog 
3.3 详解四种基本布局 
3.3.1 LinearLayout 
3.3.2 RelativeLayout 
3.3.3 FrameLayout 
3.3.4 TableLayout 
3.4 系统控件不够用?创建自定义控件 
3.4.1 引入布局 
3.4.2 创建自定义控件 
3.5 最常用和最难用的控件——ListView 
3.5.1 ListView的简单用法 
3.5.2 定制ListView的界面 
3.5.3 提升ListView的运行效率 
3.5.4 ListView的点击事件 
3.6 单位和尺寸 
3.6.1 px和pt的窘境 
3.6.2 dp和sp来帮忙 
3.7 编写界面的最佳实践 
3.7.1 制作Nine-Patch图片 
3.7.2 编写精美的聊天界面 
3.8 小结与点评 
第4章 手机平板要兼顾,探究碎片 
4.1 碎片是什么 
4.2 碎片的使用方式 
4.2.1 碎片的简单用法 
4.2.2 动态添加碎片 
4.2.3 在碎片中模拟返回栈 
4.2.4 碎片和活动之间进行通信 
4.3 碎片的生命周期 
4.3.1 碎片的状态和回调 
4.3.2 体验碎片的生命周期 
4.4 动态加载布局的技巧 
4.4.1 使用限定符 
4.4.2 使用最小宽度限定符 
4.5 碎片的最佳实践——一个简易版的新闻应用 
4.6 小结与点评 
第5章 全局大喇叭,详解广播机制 
5.1 广播机制简介 
5.2 接收系统广播 
5.2.1 动态注册监听网络变化 
5.2.2 静态注册实现开机启动 
5.3 发送自定义广播 
5.3.1 发送标准广播 
5.3.2 发送有序广播 
5.4 使用本地广播 
5.5 广播的最佳实践——实现强制下线功能 
5.6 Git时间,初识版本控制工具 
5.6.1 安装Git 
5.6.2 创建代码仓库 
5.6.3 提交本地代码 
5.7 小结与点评 
第6章 数据存储全方案,详解持久化技术 
6.1 持久化技术简介 
6.2 文件存储 
6.2.1 将数据存储到文件中 
6.2.2 从文件中读取数据 
6.3 SharedPreferences存储 
6.3.1 将数据存储到SharedPreferences中 
6.3.2 从SharedPreferences中读取数据 
6.3.3 实现记住密码功能 
6.4 SQLite数据库存储 
6.4.1 创建数据库 
6.4.2 升级数据库 
6.4.3 添加数据 
6.4.4 更新数据 
6.4.5 删除数据 
6.4.6 查询数据 
6.4.7 使用SQL操作数据库 
6.5 SQLite数据库的最佳实践 
6.5.1 使用事务 
6.5.2 升级数据库的最佳写法 
6.6 小结与点评 
第7章 跨程序共享数据,探究内容提供器 
7.1 内容提供器简介 
7.2 访问其他程序中的数据 
7.2.1 ContentResolver的基本用法 
7.2.2 读取系统联系人 
7.3 创建自己的内容提供器 
7.3.1 创建内容提供器的步骤 
7.3.2 实现跨程序数据共享 
7.4 Git时间,版本控制工具进阶 
7.4.1 忽略文件 
7.4.2 查看修改内容 
7.4.3 撤销未提交的修改 
7.4.4 查看提交记录 
7.5 小结与点评 
第8章 丰富你的程序,运用手机多媒体 
8.1 使用通知 
8.1.1 通知的基本用法 
8.1.2 通知的高级技巧 
8.2 接收和发送短信 
8.2.1 接收短信 
8.2.2 拦截短信 
8.2.3 发送短信 
8.3 调用摄像头和相册 
8.3.1 将程序运行到手机上 
8.3.2 调用摄像头拍照 
8.3.3 从相册中选择照片 
8.4 播放多媒体文件 
8.4.1 播放音频 
8.4.2 播放视频 
8.5 小结与点评 
第9章 后台默默的劳动者,探究服务 
9.1 服务是什么 
9.2 Android多线程编程 
9.2.1 线程的基本用法 
9.2.2 在子线程中更新UI 
9.2.3 解析异步消息处理机制 
9.2.4 使用AsyncTask 
9.3 服务的基本用法 
9.3.1 定义一个服务 
9.3.2 启动和停止服务 
9.3.3 活动和服务进行通信 
9.4 服务的生命周期 
9.5 服务的更多技巧 
9.5.1 使用前台服务 
9.5.2 使用IntentService 
9.6 服务的最佳实践——后台执行的定时任务 
9.7 小结与点评 
第10章 看看精彩的世界,使用网络技术 
10.1 WebView的用法 
10.2 使用HTTP协议访问网络 
10.2.1 使用HttpURLConnection 
10.2.2 使用HttpClient 
10.3 解析XML格式数据 
10.3.1 Pull解析方式 
10.3.2 SAX解析方式 
10.4 解析JSON格式数据 
10.4.1 使用JSONObject 
10.4.2 使用GSON 
10.5 网络编程的最佳实践 
10.6 小结与点评 
第11章 Android特色开发,基于位置的服务 
11.1 基于位置的服务简介 
11.2 找到自己的位置 
11.2.1 LocationManager的基本用法 
11.2.2 确定自己位置的经纬度 
11.3 反向地理编码,看得懂的位置信息 
11.3.1 Geocoding API的用法 
11.3.2 对经纬度进行解析 
11.4 使用百度地图 
11.4.1 申请API Key 
11.4.2 让地图显示出来 
11.4.3 定位到我的位置 
11.4.4 使用覆盖物来增加更多功能 
11.5 Git时间,版本控制工具的高级用法 
11.5.1 分支的用法 
11.5.2 与远程版本库协作 
11.6 小结与点评 
第12章 Android特色开发,使用传感器 
12.1 传感器简介 
12.2 光照传感器 
12.2.1 光照传感器的用法 
12.2.2 制作简易光照探测器 
12.3 加速度传感器 
12.3.1 加速度传感器的用法 
12.3.2 模仿微信摇一摇 
12.4 方向传感器 
12.4.1 方向传感器的用法 
12.4.2 制作简易指南针 
12.5 小结与点评 
第13章 继续进阶,你还应该掌握的高级技巧 
13.1 全局获取Context的技巧 
13.2 使用Intent传递对象 
13.2.1 Serializable方式 
13.2.2 Parcelable方式 
13.3 定制自己的日志工具 
13.4 调试Android程序 
13.5 编写测试用例 
13.5.1 创建测试工程 
13.5.2 进行单元测试 
13.6 总结 
第14章 进入实战,开发酷欧天气 
14.1 功能需求及技术可行性分析 
14.2 Git时间,将代码托管到GitHub上 
14.3 创建数据库和表 
14.4 遍历全国省市县数据 
14.5 显示天气信息 
14.6 切换城市和手动更新天气 
14.7 后台自动更新天气 
14.8 修改图标和名称 
14.9 你还可以做的事情 
第15章 最后一步,将应用发布到Google Play 
15.1 生成正式签名的APK文件 
15.2 申请Google Play账号 
15.3 上传和发布应用程序 
15.4 嵌入广告进行盈利 
15.4.1 注册有米账号和验证身份 
15.4.2 下载和接入有米SDK 
15.4.3 重新发布应用程序 
15.5 结束语 Android(43)
经过一端相对较长的时间,终于将郭大神的《第一行代码》看完了,亲自实践了书中所有的大小案例,以及git的使用,当然还补充学习了一些和书中内容相关的扩展知识,以及廖雪峰老师官网的git教程,关于《第一行代码》的学习也都在博客上有所记录,并且对其中的有些已经过时的方法也写了一点自己的看法,最后就是实践书最后面的小例子《酷欧天气》。
首先,先说一下例子中涉及到的Android知识点:
Android中基本控件的使用及布局
SQLite数据库及SharePreference的使用
HttpURLConnection及网络请求相关的使用
Json数据的解析
Android中Activity、Service、Broadcast这三大组件的使用,内容提器没有用到
Android中简单动画的使用
Android小组件
Widget的使用
接着,再说说使用到的API
省份信息获取采用中国天气网提供的数据,最终可以获取到天气代号
具体天气信息的获取使用百度的APIStore提供的天气获取接口,可以获取最近5天的天气情况
注:APIStore的天气接口所需要的城市代码即是第一步中获取到的天气代号
接下来说说界面设计,界面设计主要是参考了小米手机自带的天气应用,当然不是实现了小米天气所有的功能,只实现了部分功能。
接着放上开发流程:
酷欧天气开发(后更名为冰鉴天气)
2016 新增数据库帮助类,以及各表对应的实体类
2016 新增自定义网络请求类,以及处理服务器返回数据及保存工具类
2016 新增省、市、县三级数据显示,界面及基本逻辑完成
2016 新增天气首页界面,增加网络请求数据解析及存储解析出的天气信息解析工具类
2016 23:44 新增网络请求天气数据及数据显示,调整天气信息显示首页布局
2016 新增未来四天天气信息显示,当天生活建议显示,增加手动切换城市功能,优化界面显示
2016 新增天气页面菜单,新增手动更新天气功能和后台自动更新天气功能,修改应用图标,修改应用名称为冰鉴天气,在百度开放平台和小米开放平台申请上线
2016 新增天气图片随天气状况进行改变功能,加入小米自动更新功能和小米后台简单统计功能
2016 修改菜单弹出动画,增加天气桌面小组件
最后放上项目在GitHub的开源地址
本人比较菜,但欢迎大家去GitHub给我Star一下,欢迎大家Fork,提出意见。
对了,该应用已经在小米应用商店、应用宝、百度商店、91商店,安卓市场上线,名称为冰鉴天气,欢迎大家下载试试,现在版本号为1.0.1。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13186次
排名:千里之外
原创:60篇
评论:15条
文章:29篇
阅读:8532
一个喜欢钻研技术的程序猿,喜欢一切新的技术,目前主要的学习方向为Android
对博客中的内容有疑问,或者有更好的建议,可以发私信给我,也可以加入QQ交流群
(2)(8)(7)(6)(29)(8)跟着第一行代码敲酷欧天气,遇到了一个问题,但又没报错。请求帮助。-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
跟着第一行代码敲酷欧天气,遇到了一个问题,但又没报错。请求帮助。
来源:互联网 更新时间: 14:26:24 责任编辑:王亮字体:
用户提出问题:跟着第一行代码敲酷欧天气,遇到了一个问题,但又没报错。请求帮助。,具体如下:
通过互联网整理获得以下解决方法:=================1楼=====================
08-17&02:10:02.714&/com.coolweather.app&I/art:&Not&late-enabling&-Xcheck:jni&(already&on)
08-17&02:10:02.714&/com.coolweather.app&W/art:&Unexpected&CPU&variant&for&X86&using&defaults:&x86_64
08-17&02:10:02.841&/com.coolweather.app&W/System:&ClassLoader&referenced&unknown&path:&/data/app/com.coolweather.app-1/lib/x86_64
08-17&02:10:03.374&/com.coolweather.app&W/art:&Suspending&all&threads&took:&6.227ms
08-17&02:10:03.700&/com.coolweather.app&W/System:&ClassLoader&referenced&unknown&path:&/data/app/com.coolweather.app-1/lib/x86_64
08-17&02:10:04.032&/com.coolweather.app&I/OpenGLRenderer:&Initialized&EGL,&version&1.4
08-17&02:10:04.032&/com.coolweather.app&D/OpenGLRenderer:&Swap&behavior&1
08-17&02:10:07.587&/com.coolweather.app&D/NetworkSecurityConfig:&No&Network&Security&Config&specified,&using&platform&default
08-17&02:14:54.143&/com.coolweather.app&D/NetworkSecurityConfig:&No&Network&Security&Config&specified,&using&platform&default
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号第一行代码酷欧天气开发(三) - 博客频道 - CSDN.NET
aiyuan1996的专栏
分类:Android个人整理
这步是最关键的一步,编写用于遍历省市县数据的activity了,在activity包下面新建ChooseAreaActivity继承自Activity
该类的逻辑是下面这样的:
在onCreate()方法中显示获取到了一些控件的实例,然后去初始化ArrayAdapter,将他设置为listview的适配器,之后去获取CoolWeatherDB的实例,并给ListView设置点击事件,到这里我们的初始化工作就算是完成了。
在onCreate()方法的最后,调用了queryprovinces()方法,也就是从这里开始加载省级数据的,queryProvinces()方法的内部首先会调用CoolWeatherDB的loadProvinces()方法来从数据库中读取省级数据,如果读取到了就直接将数据显示到界面上,如果没有读取到就调用queryFromServer()方法从服务器上查询数据。
queryFromServer()方法会先根据闯入的参数来拼装查询地址,这个地址就是我们在最前面分析过的,确定了查询地址后,接下来就调用HttpUtil的sendHttpResquest()方法来向服务器发送请求,响应的数据会调onFinish()方法,然后我们在这里去调用Utility的handleProvinceResponse()方法来解析和处理服务器返回的数据,并存储到到数据库中,接下来的一步很关键,在解析和处理完数据之后,我们再次调用了queryProvinces()方法来重新加载省级数据,由于queryProvinces()方法牵扯到了UI操作,因此必须要在这线程中调用,这里接住了runOnUiThread()方法来实现从子线程切换到主线程,他的实现原理也是基于异步任务处理机制的,现在数据库中已经有了数据,因此调用queryProvinces()会直接将数据显示到界面上了
当你点击某个省的时候会进入listview的onItenClick()方法,这个时候会根据当前的级别来判断逝去调用queryCities()方法还是queryCounties()方法,这两个方法的流程和queryProvinces()方法基本相同,
package com.coolweather.app.
import java.util.ArrayL
import java.util.L
import android.app.A
import android.app.ProgressD
import android.app.ActionBar.T
import android.content.I
import android.content.SharedP
import android.os.B
import android.preference.PreferenceM
import android.text.TextU
import android.util.L
import android.view.V
import android.view.W
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.ArrayA
import android.widget.ListV
import android.widget.TextV
import android.widget.T
import com.coolweather.app.R;
import com.coolweather.app.db.CoolWeatherDB;
import com.coolweather.app.model.C
import com.coolweather.app.model.C
import com.coolweather.app.model.P
import com.coolweather.app.util.HttpCallbackL
import com.coolweather.app.util.HttpU
import com.coolweather.app.util.U
public class ChooseAreaActivity extends Activity {
String TAG = "ChooseAreaActivity";
public static final int LEVEL_PROVINCE = 0;
public static final int LEVEL_CITY = 1;
public static final int LEVEL_COUNTY = 2;
private ProgressDialog progressD
private TextView titleT
private ListView listV
private ArrayAdapter&String&
private CoolWeatherDB coolWeatherDB;
private List&String& dataList = new ArrayList&String&();
private List&Province& provinceL
private List&City& cityL
private List&County& countyL
* 选中的省份
private Province selectedP
* 选中的城市
private City selectedC
* 当前选中的级别
private int currentL
* 是否从WeatherActivity中跳转过来。
private boolean isFromWeatherA
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isFromWeatherActivity = getIntent().getBooleanExtra("from_weather_activity", false);
Log.d(TAG, "isFromWeatherActivity=" + isFromWeatherActivity);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ChooseAreaActivity.this);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.choose_area);
listView = (ListView) findViewById(R.id.list_view);
titleText = (TextView) findViewById(R.id.title_text);
adapter = new ArrayAdapter&String&(this, android.R.layout.simple_list_item_1, dataList);
listView.setAdapter(adapter);
coolWeatherDB = CoolWeatherDB.getInstance(this);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View view, int index,
long arg3) {
if (currentLevel == LEVEL_PROVINCE) {
selectedProvince = provinceList.get(index);
queryCities();
} else if (currentLevel == LEVEL_CITY) {
selectedCity = cityList.get(index);
queryCounties();
} else if (currentLevel == LEVEL_COUNTY) {
String countyCode = countyList.get(index).getCountyCode();
Log.d(TAG, countyCode+"h");
Intent intent = new Intent(ChooseAreaActivity.this, WeatherActivity.class);
intent.putExtra("county_code", countyCode);
startActivity(intent);
queryProvinces();
* 查询全国所有的省,优先从数据库查询,如果没有查询到再去服务器上查询。
private void queryProvinces() {
provinceList = coolWeatherDB.loadProvince();
if (provinceList.size() & 0) {
dataList.clear();
for (Province province : provinceList) {
dataList.add(province.getProvinceName());
adapter.notifyDataSetChanged();
listView.setSelection(0);
titleText.setText("中国");
currentLevel = LEVEL_PROVINCE;
queryFromServer(null, "province");
* 查询选中省内所有的市,优先从数据库查询,如果没有查询到再去服务器上查询。
private void queryCities() {
cityList = coolWeatherDB.loadCities(selectedProvince.getId());
if (cityList.size() & 0) {
dataList.clear();
for (City city : cityList) {
dataList.add(city.getCityName());
adapter.notifyDataSetChanged();
listView.setSelection(0);
titleText.setText(selectedProvince.getProvinceName());
currentLevel = LEVEL_CITY;
queryFromServer(selectedProvince.getProvinceCode(), "city");
* 查询选中市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询。
private void queryCounties() {
Log.d(TAG, selectedCity.getId()+"");
countyList = coolWeatherDB.loadCounties(selectedCity.getId());
if (countyList.size() & 0) {
dataList.clear();
for (County county : countyList) {
dataList.add(county.getCountyName());
adapter.notifyDataSetChanged();
listView.setSelection(0);
titleText.setText(selectedCity.getCityName());
currentLevel = LEVEL_COUNTY;
queryFromServer(selectedCity.getCityCode(), "county");
* 根据传入的代号和类型从服务器上查询省市县数据。
private void queryFromServer(final String code, final String type) {
if (!TextUtils.isEmpty(code)) {
address = ".cn/data/list3/city" + code + ".xml";
address = ".cn/data/list3/city.xml";
showProgressDialog();
HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
public void onFinish(String response) {
boolean result = false;
if ("province".equals(type)) {
result = Utility.handleProvincesResponse(coolWeatherDB,
response);
} else if ("city".equals(type)) {
result = Utility.handleCitiesResponse(coolWeatherDB,
response, selectedProvince.getId());
} else if ("county".equals(type)) {
result = Utility.handleCountiesResponse(coolWeatherDB,
response, selectedCity.getId());
if (result) {
runOnUiThread(new Runnable() {
public void run() {
closeProgressDialog();
if ("province".equals(type)) {
queryProvinces();
} else if ("city".equals(type)) {
queryCities();
} else if ("county".equals(type)) {
queryCounties();
public void onError(Exception e) {
runOnUiThread(new Runnable() {
public void run() {
closeProgressDialog();
Toast.makeText(ChooseAreaActivity.this,
"加载失败", Toast.LENGTH_SHORT).show();
* 显示进度对话框
private void showProgressDialog() {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在加载...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
* 关闭进度对话框
private void closeProgressDialog() {
if (progressDialog != null) {
progressDialog.dismiss();
* 捕获Back按键,根据当前的级别来判断,此时应该返回市列表、省列表、还是直接退出。
public void onBackPressed() {
if (currentLevel == LEVEL_COUNTY) {
queryCities();
} else if (currentLevel == LEVEL_CITY) {
queryProvinces();
if (isFromWeatherActivity) {
Log.d(TAG, "issi");
Intent intent = new Intent(this, WeatherActivity.class);
startActivity(intent);
这里,我们还需要在xml文件中注册这个活动和给他网络权限,如下
android:name=".activity.ChooseAreaActivity"
android:label="@string/app_name" &
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
然后给网络权限
android:name="android.permission.INTERNET"/&
下面几张截图是对流程的简单说明和方法的阐述
listview的点击事件
查询全国所有的省份信息
接下里是HttpUtil.sendHttpRequest()方法
ok,这一步也完成了。
下一步就要显示天气信息了
aiyuan1996
排名:千里之外
(3)(1)(0)(2)(1)(13)(2)}

我要回帖

更多关于 苏拉玛最后一章 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信