文档章节

Android学习系列笔记(四)

y
 yangjianliu
发布于 2017/07/06 17:53
字数 2033
阅读 7
收藏 0
点赞 0
评论 0

##Android基础网络第一天

01 网络html源码查看器

访问网络需要加Internet权限:
android.permission.INTERNET 

	
使用UrlConnection请求一个url地址获取内容:

		//1.创建一个Url对象
			URL url = new URL(url_str);
		//2.获取一个UrlConnection对象
			HttpURLConnection connection = (HttpURLConnection)url.openConnection();
		//3.为UrlConnection对象设置一些请求的参数,请求方式,连接的超时时间 
			connection.setRequestMethod("GET");//设置请求方式
			connection.setConnectTimeout(1000*10);//设置超时时间
		//4.在获取url请求的数据前需要判断响应码,200 :成功,206:访问部分数据成功   300:跳转或重定向  400:错误 500:服务器异常
			int code = connection.getResponseCode();
			if(code == 200){
		//5.获取有效数据,并将获取的流数据解析成String
				InputStream inputStream = connection.getInputStream();
				String result = StreamUtils.streamToString(inputStream);



注意事项:
	
	1. ANR:application not response 应用无响应; androoid中耗时的操作(请求网络,大文件的拷贝,数据库的操作)需要在子线程中做。
	09-02 01:52:40.711: E/ActivityManager(857): ANR in com.itheima.sourcelook (com.itheima.sourcelook/.MainActivity)

	2. 4.0后网络操作强制在子线程中进行。因为网络访问是耗时的操作,可能会导致ANR
	09-02 01:57:32.879: W/System.err(1789):  android.os.NetworkOnMainThreadException

	3.错误线程调用异常,子线程不能够更新UI(控件的内容)
		09-02 02:02:08.873: W/System.err(1858): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


	主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler.

02 消息机制的写法(重要) Handler

	使用Handler的步骤:

	1.主线程中创建一个Handler
	private Handler handler = new Handler(){
			public void handleMessage(android.os.Message msg) {
	
	
			};
	};

	2.重写handler的handlermessage方法

	3.子线程中创建一个Message对象,将获取的数据绑定给msg
			Message msg = new Message();
			//另一种方式:Message msg = Messge.obtain;
			msg.obj = result;
	4.主线程中的handler对象在子线程中将message发送给主线程
			handler.sendMessage(msg);
	
	5.主线程中handlermessage方法接受子线程发来的数据,就可以做更新UI的操作。
			
		
***********主线程
	
//☆☆☆1.在主线程中创建一个Handler对象
private Handler handler = new Handler(){
	//☆☆☆2.重写handler的handlermessage方法,用来接收子线程中发来的消息
	public void handleMessage(android.os.Message msg) {
		//☆☆☆5.接收子线程发送的数据,处理数据。
		Bitmap bitmap  = (Bitmap) msg.obj;
		//☆☆☆6.当前方法属于主线程可以做UI的更新
		//五.获取服务器返回的内容,显示到textview上
		img_pic.setImageBitmap(bitmap);//设置ImageView的图片内容
	};
};

************子线程

		if(code == 200){
			//5.获取有效数据,并将获取的流数据解析成String
					InputStream inputStream = connection.getInputStream();
					
					//将一个读取流转换成一个图片 Drawable , Btimap:位图  ?????
					Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
					
					
					//☆☆☆3.子线中创建一个Message对象,为了携带子线程中获取的数据给主线程。
					Message msg = Message.obtain();//获取一个Message对象,内部实现是:如果之前的Message存在直接返回,不存在创建新的Message返回
					msg.obj = bitmap;//将获取的数据封装到msg中。
					//☆☆☆4.使用handler对象将message发送到主线程。
					handler.sendMessage(msg);
		
					
				}

03 消息机制原理(重要)

有几个主要元素:

1.Message:用来携带子线程中的数据。
2.MessageQueue:用来存放所有子线程发来的Message.
3.Handler:用来在子线程中发送Message,在主线程中接受Message,处理结果
4.Looper:是一个消息循环器,一直循环遍历MessageQueue,从MessageQueue中取一个Message,派发给Handler处理。

原理看资料中的图。

04 网络图片查看器

	adb shell+  input text 内容;可以通过将内容输入到手机上的输入框。

	将一个读取流转换成bitmap对象:

	BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象。
	Bitmap bitmap = BitmapFactory.decodeStream(InputStream in);
	
	imageView.setImageBitmap(bitmap);//设置图片内容

05 常见消息处理api(重要)

	面试:子线程一定不能更新UI? SurfaceView :多媒体视频播放 ,可以在子线程中更新UI; Progress(进度)相关的控件:也是可以在子线程中更新Ui;审计机制:activity完全显示的时候审计机制才会去检测子线程有没有更新Ui.
	

	1.使用activity的runOnUiThread方法更新ui,无论当前线程是否是主线程,都将在主线程执行.
			runOnUiThread(new Runnable() {
				
				[@Override](https://my.oschina.net/u/1162528)
				public void run() {
					tv_simple.setText("我被更新了");
				}
			});

	2.使用handler直接post到主线程,handler需要在主线程创建
				//延迟多少毫米执行runnable。
				mHandler.postDelayed(new Runnable() {
				
				[@Override](https://my.oschina.net/u/1162528)
				public void run() {

					tv_simple.setText("我被更新了");
				}
			}, 1000*5);

		应用场景:广告展示后,做页面跳转。

06 新闻客户端案例(重要) 项目 和 产品

	第一次进入新闻客户端需要请求服务器获取新闻数据,做listview的展示,为了第二次再次打开新闻客户端时能快速显示新闻,需要将数据缓存到数据库中,下次打开可以直接去数据库中获取新闻直接做展示。


	1.写布局listview  ok

	2.找到listview,设置条目的点击事件。  ok

	3.获取数据提供给listview做展示。

		3.1:获取本地数据库缓存的新闻数据,让listview显示。如果没有网络不至于显示空界面。
		3.2:请求服务器获取新闻数据,是一个json字符串,需要解析json,封装到list集合中。提供给listview展示。

		public static String newsPath_url = "http://192.168.13.83:8080/itheima74/servlet/GetNewsServlet";
//封装新闻的假数据到list中返回
public static ArrayList<NewsBean> getAllNewsForNetWork(Context context) {
	ArrayList<NewsBean> arrayList = new ArrayList<NewsBean>();
	try{
		//1.请求服务器获取新闻数据
		//获取一个url对象,通过url对象得到一个urlconnnection对象
		URL url = new URL(newsPath_url);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		//设置连接的方式和超时时间
		connection.setRequestMethod("GET");
		connection.setConnectTimeout(10*1000);
		//获取请求响应码
		int code = connection.getResponseCode();
		if(code == 200){
			//获取请求到的流信息
			InputStream inputStream = connection.getInputStream();
			String result = StreamUtils.streamToString(inputStream);
			
			//2.解析获取的新闻数据到List集合中。
			
				JSONObject root_json = new JSONObject(result);//将一个字符串封装成一个json对象。
				JSONArray jsonArray = root_json.getJSONArray("newss");//获取root_json中的newss作为jsonArray对象
				
				for (int i = 0 ;i < jsonArray.length();i++){//循环遍历jsonArray
					JSONObject news_json = jsonArray.getJSONObject(i);//获取一条新闻的json
					
					NewsBean newsBean = new NewsBean();
					
					newsBean. id = news_json.getInt("id");
					newsBean. comment = news_json.getInt("comment");//评论数
					newsBean. type = news_json.getInt("type");//新闻的类型,0 :头条 1 :娱乐 2.体育
					newsBean. time = news_json.getString("time");
					newsBean. des = news_json.getString("des");
					newsBean. title = news_json.getString("title");
					newsBean. news_url = news_json.getString("news_url");
					newsBean. icon_url = news_json.getString("icon_url");
					
					arrayList.add(newsBean);
		
				}

			//3.清楚数据库中旧的数据,将新的数据缓存到数据库中
				new NewsDaoUtils(context).delete();
				new NewsDaoUtils(context).saveNews(arrayList);
		}
		
	}catch (Exception e) {
		e.printStackTrace();
	}
	return arrayList;
}

		3.3: 获取服务端数据成功后,需要缓存到本地数据库,缓存前需要清空本地数据库。

	4.创建一个Adapter继承BaseAdapter,封装4个方法,需要接收获取的新闻数据   ok


	5.将adapter设置给listview。   ok

07 采用smartimageview 显示(开源的小项目)

github : 12306 出名

自定义的控件在布局文件中的引用都需要指定类的完整路径

08 smartimageview 的原理

1.自定义了一个MyImageview类继承了Imageview,添加三个构造方法

2.添加一个setImageUrl方法接受一个图片url
	
3.新建一个子线程去请求url获取图片资源

4.将获取的图片Bitmap通过handler发送给主线程,主线程设置给当前view.

5.在布局中引用MyImageview,需要指定完成的包名路径。

09 get方式提交数据到服务器

10 post方式提交数据到服务器

	get方式和post方式的区别:

	1.请求的URL地址不同:
		post:"http://192.168.13.83:8080/itheima74/servlet/LoginServlet"
		get:http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username=root&pwd=123

	2.请求头不同:
		****post方式多了几个请求头:Content-Length   Cache-Control  Origin

		openConnection.setRequestProperty("Content-Length", body.length()+"");
		openConnection.setRequestProperty("Cache-Control", "max-age=0");
		openConnection.setRequestProperty("Origin", "http://192.168.13.83:8080");

		****post方式还多了请求的内容:username=root&pwd=123

			//设置UrlConnection可以写请求的内容
		openConnection.setDoOutput(true);
		//获取一个outputstream,并将内容写入该流
		openConnection.getOutputStream().write(body.getBytes());

	3.请求时携带的内容大小不同
		get:1k 
		post:理论无限制

© 著作权归作者所有

共有 人打赏支持
y
粉丝 0
博文 20
码字总数 52833
作品 0
成都
Cocos2dx游戏开发系列笔记9:android手机上运行《战神传说》,并解决横竖屏即分辨率自适应

上节说到cygwin下成功编译出so文件,下面我们要把游戏运行在android上。 开始干活! 其实步骤可以参考 Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上 1 用eclipse打...

懒骨头
2013/12/09
0
0
Cocos2dx游戏开发系列笔记1:一个崭新的开始,cocos2dx2.2+ndkr9+Cygwin

Android开发者做cocos2dx最大的绊脚石,不是c++,而是环境的搭建... 骨头也是费了半天劲才终于在真机上看到了那个类似猕猴桃的头,这里简单记录一下。 环境:(算比较新了2013.11.17) coco...

懒骨头
2013/12/09
0
0
Android adt bundle 开发环境配置及第一个“Hello world”程序运行

最近在学习Android 顺便记录下学习过程当作复习吧,这是写的第一篇正式博客。 一、jdk环境配置 二、android adt bundle 下载 三、安装SDK 四、模拟器及真机调试 五、第一个程序 Hello world!...

程序猿付显
2014/07/23
0
0
【Android学习总结】之Activity:深入理解、体验Activity的生命周期

【本博客内的文章是本人的学习笔记总结,如有错误请各位批评指正,谢谢!欢迎加入群285077071讨论】 关于Activity的生命周期的学习,我将从以下几个方面入手来全面认识: 一、什么是生命周期...

kinbos
06/26
0
0
Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho
06/06
0
0
ViewSwitcher学习笔记

ViewSwitcher 的作用简单来说就是:在两个视图间转换时显示动画 它的两个子类应该很熟悉,ImageSwitcher:转换图片时增加动画效果; TextSwitcher: 转换文字时增加动画效果; API翻译 一、结构...

无一物
2012/12/20
0
0
Android 动画:这是一份详细 & 清晰的 动画学习指南

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho
05/03
0
0
CSDN精选Android开发博客

[1] 张国威:Android从入门到提高系列 前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针...

晨曦之光
2012/02/24
0
0
Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上

感谢听D同学赞助的Demo。 那怎样让它运行在vs中呢: 1 使用cocos2d-x-2.2toolsproject-creator文件夹中的create_project.py脚本,生成一个demo。 2 拷贝Classes和Resources文件夹到刚生成的d...

懒骨头
2013/12/09
0
0
第一天学习Android的一些笔记

昨天学习了怎样装Android配置环境,下载SDK用了好久的时间,再加上一开始不会,弄了好长时间,今天第一天学习,跟着视频教程学的。下边是我的一些笔记,仅做留念与学习笔记 。 快捷键: 智能...

子弹兄
2014/01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
11分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
17分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
32分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
39分钟前
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
46分钟前
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
47分钟前
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
50分钟前
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0
转行零基础该如何学Python?这些一定要明白!

转行零基础学Python编程开发难度大吗?从哪学起?近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大?今天,小编就来为大家详细解读一下这个问题。...

猫咪编程
今天
2
0
205. Isomorphic Strings - LeetCode

Question 205. Isomorphic Strings Solution 题目大意:判断两个字符串是否具有相同的结构 思路:构造一个map,存储每个字符的差,遍历字符串,判断两个两个字符串中相同位置字符的差是否相同 Ja...

yysue
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部