黑马程序员技术交流社区

标题: 【长沙校区】十年磨一剑【基哥笔记】Android基础Day04(网络) [打印本页]

作者: allen927    时间: 2015-11-1 16:38
标题: 【长沙校区】十年磨一剑【基哥笔记】Android基础Day04(网络)
本帖最后由 allen927 于 2015-11-1 16:40 编辑


同样的课程、老师、就业,更好的学习环境,更低的学习成本!
内地学员,选择长沙校区,靠谱!!!
报名热线:0731-85833115
  QQ  : 2355535415

android基础Day04(网络交互)

资源总连接:http://bbs.itheima.com/thread-249703-1-1.html

《 如果感觉今天的知识点都会了,可以直接做作业,来进行检测》

(了解)主题
主题:theme
     控制Application  或者 Activity的显示   
AndroidManifest.xml就可以看见

android系统的主题定义:adt-bundle-windows-x86\sdk\platforms\android-10\data\res\values\themes.xml

定义一个全屏的主题:
1 没有标题   2 没有状态栏




源码开发  手机定制   
三方应用开发:一般都是使用系统自带的主题。

(掌握)动画

animation:动画
1 Tween :补件动画   (动画)
2 Frame:帧动画(图片资源  一组图片在执行切换)

   1 Tween

alpha:透明度改变
scale:缩放动画
transalte:移动动画
rotate:旋转动画

1 xml配置
2 java代码编程








动画的集合
把所有的动画配置给set节点


   2帧动画
帧动画:他是图片资源
一组图片的集合  正在进行图片的切换








(了解)国际化
android里面的国际化基于配置的i18n
1 图片的国际化
2 文字的国际化

   1 图片的国际化

   2 文字的国际化

国际化一般都是放置在最后进行处理。



(了解)网络交互的原理
怎样才能和服务器进行交互?
使用网络协议:HTTP   TCP/IP   TCP/UDP   ....SOCKET
通过网页和服务器进行交互:网页应用程序封装了Http协议。
Http协议:超文本传输协议
请求+响应来组成:有求必应
HTTP请求消息中,请求方式有GETPOSTHEADOPTIONSDELETETRACEPUTCONNECT八种。
而在以后们最常用的有两种请求方式:POST请求、GET请求。
get请求和post请求的区别?
get请求:他的数据是携带在url的后面   服务器对于url的长度是有限制的。2kb  4kb ...这里是可以在服务器动态配置的
post请求:把数据封装在请求实体里面。

请求:
   请求头:header
   请求体:entity

响应:
   相应头
   相应体

客户端请求服务器的过程:



(掌握)Android网络编程API
android手机看成一个浏览器。去执行网络请求。
就需要使用Http协议来编程,使用api
android给我们提供了什么样的网络api.

网络地址

把一个路径包装成一个网络地址
打开连接

连接对象

   设置网络超时时长
[attach]91360[/attach]设置请求的方法
[attach]91361[/attach]获取响应码
获取服务返回的数据


(掌握)网络图片查看器
    在服务器上一一张图片,使用android手机来显示
    1 看服务器的资源是否可以正确的访问

联网是需要权限







主线程不能联网:4.0开始系统设置。
在主线程是不能执行联网操作。
原因:
1 联网一定是一个耗时的操作
2 主线程是负责界面的显示:主线程不能阻塞  
如果主线程被阻塞:用户的行为5s内无法被系统响应。就会导致一个异常:ANR application not response  

以后联网那就需要记住操作:
1 开线程   new Thread(){run(){}}.start()
2 添加联网权限

(掌握)子线程不可以直接操作UI
只有主线程才能操作显示

(掌握)消息机制常见类介绍





(掌握)网页源码查看器


(掌握)消息处理常见API





(掌握)消息处理的原理
Handler:消息处理器    发送消息   处理消息
Message:消息    what  obj   arg1  arg2  callback:Runnable接口   target:目标  Handler  when:消息发送的时间
MessageQueue:消息队列    临时存储消息  
Looper:消息泵    从消息队列里面抽取消息
HandlerThread:消息处理的线程   一个执行的线程:场所
消息


(掌握)网易新闻客户端案例
从服务器上获取数据然后列表显示
服务器上:提供一个网络地址:提供一个xml文件
android客户端:列表显示  ListView   + Adapter



(了解)smartimageview的使用
smartimageview:智能   ImageView  他使用框架  
www.github.com  开源的网站。。。






(掌握)smartimageview的原理
1 线程  Thread  
2 URL + HttpURLConnection
3 Handler + Message



(掌握)get方式提交数据
[size=29.3333339691162px]


        /**
         * 使用Http协议 以GET请求提交数据到服务器
         * @param map 数据
         * @param path 请求路径
         * @return
         * @throws Exception
         */
        public static boolean doHttpGet(Map<String, String> map, String path) throws Exception{
                //特点:http://localhost:8080/web/LoginServlet?name=itcast&pwd=234
                //拼接uri
                StringBuffer sb = new StringBuffer(path);
                sb.append("?");
                for(Map.Entry<String, String> entry:map.entrySet()){
                        String key = entry.getKey();
                        String value = entry.getValue();
                        sb.append(key).append("=").append(value);
                        sb.append("&");
                }
                //删除最后一个&
                sb.deleteCharAt(sb.length()-1);

                URL url = new URL(sb.toString());
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000);
                if(conn.getResponseCode() == 200){
                        //获取服务器回送的流数据
                        InputStream inputStream = conn.getInputStream();
                        //返回 success  or  error
                        String content = changeStreamToString(inputStream);
                        if("success".equals(content)){
                                return true;
                        }else{
                                return false;
                        }
                }
                return false;
        }
(掌握)post方式提交数据到服务器
不会把参数带在url的后面
把参数放在请求实体里面
请求头
POST /web/LoginServlet HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/web/
Accept-Language: zh-CN
浏览器的内核信息
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2)
提交的数据类型
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
提交数据的长度
Content-Length: 19
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=0D35C904B671C07943E0B9F374F2A162

实体内容
name=itcast&pwd=123


服务器响应的信息
HTTP/1.1 200 OK     状态行    状态码
Server: Apache-Coyote/1.1
Content-Length: 7
Date: Mon, 19 Jan 2015 08:05:00 GMT

success

执行Post请求的要求:
1 HTTP协议 客户端默认是不能提交数据到服务器  必须手动的开启 允许  对外输出
2 请求头里面必须要有Content-Type  Content-Length属性


        /**
         * 使用Http协议 以POST请求提交数据到服务器
         * @param map 数据
         * @param path 请求路径
         * @return
         * @throws Exception
         */
        public static boolean doHttpPost(Map<String, String> map, String path) throws Exception{
                //特点:数据是在请求实体里面
                //拼接实体   name=itcast&pwd=123
                StringBuffer sb = new StringBuffer();
                for(Map.Entry<String, String> entry:map.entrySet()){
                        String key = entry.getKey();
                        String value = entry.getValue();
                        sb.append(key).append("=").append(value);
                        sb.append("&");
                }
                //删除多余的&
                sb.deleteCharAt(sb.length()-1);
                //实体
                byte[] entity = sb.toString().getBytes();

                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setConnectTimeout(5000);
                //运行对外输出
                conn.setDoOutput(true);
                //请求参数
                //提交数据的类型
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                //实体的长度
                conn.setRequestProperty("Content-Length", entity.length+"");
                //把实体数据对外输出
                OutputStream outputStream = conn.getOutputStream();
                outputStream.write(entity);

                if(conn.getResponseCode() == 200){
                        //获取服务器回送的流数据
                        InputStream inputStream = conn.getInputStream();
                        //返回 success  or  error
                        String content = changeStreamToString(inputStream);
                        if("success".equals(content)){
                                return true;
                        }else{
                                return false;
                        }
                }
                return false;
        }

(掌握)httpclientgetpost
HttpClient:他是android集成的一个三方框架 Http框架
HttpClientURL  HttpClient再次进行了oop的封装
HttpClient:他就是一个浏览器  
执行请求  回送响应
HttpClient:浏览器   方法:执行  响应 HttpReponse exeucute(请求HttpUriRequest)















        /**
         * 使用HttpClient框架 以GET请求提交数据到服务器
         * @param map 数据
         * @param path 请求路径
         * @return
         * @throws Exception
         */
        public static boolean doHttpClientGet(Map<String, String> map, String path) throws Exception{
                //特点:http://localhost:8080/web/LoginServlet?name=itcast&pwd=234
                //拼接uri
                StringBuffer sb = new StringBuffer(path);
                sb.append("?");
                for(Map.Entry<String, String> entry:map.entrySet()){
                        String key = entry.getKey();
                        String value = entry.getValue();
                        sb.append(key).append("=").append(value);
                        sb.append("&");
                }
                //删除最后一个&
                sb.deleteCharAt(sb.length()-1);
                //浏览器
                HttpClient httpClient = new DefaultHttpClient();
                //get请求对象
                HttpGet request = new HttpGet(sb.toString());
                //执行请求
                HttpResponse response = httpClient.execute(request);
                //判断响应码是否为200
                if(response.getStatusLine().getStatusCode() == 200){
                        //获取服务器回送的流
                        InputStream inputStream = response.getEntity().getContent();
                        //返回 success  or  error
                        String content = changeStreamToString(inputStream);
                        if("success".equals(content)){
                                return true;
                        }else{
                                return false;
                        }
                }
                return false;
        }


post请求
        /**
         * 使用HttpClient框架 以POST请求提交数据到服务器
         * @param map 数据
         * @param path 请求路径
         * @return
         * @throws Exception
         */
        public static boolean doHttpClientPost(Map<String, String> map, String path) throws Exception{
                //post请求:请求实体
                HttpClient client = new DefaultHttpClient();//浏览器
                HttpPost request = new HttpPost(path);//post请求对象
                //实体参数
                List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                for(Map.Entry<String, String> entry:map.entrySet()){
                        String name = entry.getKey();
                        String value = entry.getValue();
                        NameValuePair nvp = new BasicNameValuePair(name, value);
                        parameters.add(nvp);
                }
                //实体
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");
                //把实体设置给请求对象
                request.setEntity(entity);
                //执行请求
                HttpResponse response = client.execute(request);
                //判断响应码是否为200
                if(response.getStatusLine().getStatusCode() == 200){
                        //获取服务器回送的流
                        InputStream inputStream = response.getEntity().getContent();
                        //返回 success  or  error
                        String content = changeStreamToString(inputStream);
                        if("success".equals(content)){
                                return true;
                        }else{
                                return false;
                        }
                }
                return false;
        }

作业:

下载资源

Doc笔记
课程视频代码
作业视频代码
相关链接:
长沙中心--黑马双元课堂JAVA入学辅导班1期火爆开班啦!!!
长沙黑马程序员学习激情无限“吊炸天”
黑马程序员长沙校区生活圈,60秒搞定吃住学
http://bbs.itheima.com/thread-243108-1-1.html



作者: q1314ian    时间: 2015-11-3 22:19
感觉很厉害的样子,我来试试......
作者: 沉默久了1024    时间: 2015-11-3 22:20
来看看,很厉害的样子
作者: 铁苯锌    时间: 2015-11-3 22:41
赞,虽然还不懂
作者: dai2686779    时间: 2015-11-3 23:10
6666666666666666666666
作者: 一脸的护胸毛丶    时间: 2015-11-3 23:31
留着点招完了看
作者: z_one    时间: 2015-11-4 16:21
试试学习一下
作者: 窝牛。    时间: 2015-11-4 17:33
留着用,楼主好人,一生平安
作者: 切比雪夫    时间: 2015-11-4 21:58
挺起!!!!!!!!!!!!!
作者: wodesteaammajia    时间: 2015-11-4 22:24
马上就要学这个了..
作者: 253186803    时间: 2015-11-4 22:56
鸡锅,又来顶贴了
作者: little_bug    时间: 2015-11-4 23:39
学JAVA的笔记呢 ?
作者: kongminggg    时间: 2015-11-5 00:16
好复杂。。。等就业班学
作者: nice非飞    时间: 2015-11-5 00:21
非常厉害。。大神
作者: 哎呀呀    时间: 2015-11-5 09:34
来瞻仰大神来的
作者: 過眼焱雲シ    时间: 2015-11-5 15:09
提前了解了解,谢谢分享
作者: 秋色潇湘    时间: 2015-11-5 23:53
支持基哥  
作者: 1026060341    时间: 2015-11-6 21:18
赞一个1111111111111111
作者: 醉叶惜秋    时间: 2015-11-6 21:29
技术贴学习一下
作者: 微笑、守望    时间: 2015-11-6 23:14
加油!为了明天!
作者: ranyong    时间: 2015-11-7 00:40
掌握技术。。加油。。
作者: ranyong    时间: 2015-11-7 00:45
代码代码!!!!!
作者: ranyong    时间: 2015-11-7 00:46
高端大气。。。。
作者: orgcheng    时间: 2015-11-7 10:07
这么多,看着就晕

作者: 微笑、守望    时间: 2015-11-7 11:32
每日一顶!
作者: zypt0218    时间: 2015-11-7 12:45
基哥真棒
作者: lihang3545    时间: 2015-11-8 00:36
加油,支持,顶一个
作者: 微笑、守望    时间: 2015-11-8 23:17
基哥分享据对好东西哈~
作者: zhengsx    时间: 2015-11-9 21:51
暂时看不懂。
作者: 18273250088    时间: 2015-11-9 22:01
靠谱   来长沙不会错
作者: 18273250088    时间: 2015-11-9 22:02
靠谱   来长沙不会错
作者: zypt0218    时间: 2015-11-9 23:08
都是精华帖啊
作者: czcjyqm    时间: 2015-11-9 23:12
来学技术了
作者: bobo大王    时间: 2015-11-9 23:16
真不错,看了之后,受益匪浅
作者: 赖洪光    时间: 2015-11-10 15:36
值得学习!
作者: young_ants    时间: 2015-11-10 21:16
顶一下,,,大赞
作者: 微笑、守望    时间: 2015-11-10 21:39
每日一顶
作者: sshh11    时间: 2015-11-10 22:03
内容很多啊  大神
作者: flairamyz    时间: 2015-11-11 13:07
为了明天,加油
作者: 784080960    时间: 2015-11-11 19:01
顶一下顶一下
作者: ppaapc    时间: 2015-11-11 20:34
楼主厉害
作者: New灬狼    时间: 2015-11-11 21:59
感觉自己要学习的东西还有号多好多啊
作者: 845479430    时间: 2015-11-14 17:57
感觉很厉害的样子,我来试试......
作者: 王玉东    时间: 2015-11-14 21:39
谢谢分享!!!!
作者: 微笑、守望    时间: 2015-11-14 22:36
每日一顶
作者: pq1051288217    时间: 2015-11-15 19:30
成败在此一举类
作者: 微笑、守望    时间: 2015-11-15 23:36
每日一顶
作者: 微笑、守望    时间: 2015-11-15 23:38
每日一顶
作者: xueshuyang    时间: 2015-11-16 23:32
来看看很厉害的样子
作者: 西伯利亚的雪景    时间: 2015-11-17 08:53
基哥的帖子都要顶一下,感谢分享!
作者: 雪域雄鹰    时间: 2016-2-23 21:01
好好学习,天天向上!
作者: 123liu123    时间: 2016-4-1 22:46
android基础很详细,很实用......
作者: 菇凉斋    时间: 2016-4-2 23:07
笔记很详细,很实用.............
作者: suiyanxin    时间: 2016-4-2 23:59
好多的内容辛苦了
作者: 菇凉斋    时间: 2016-4-3 00:27
很实用赞一个,谢谢基哥............
作者: 菇凉斋    时间: 2016-4-4 23:51
基哥赞一个,加油!!!!!!!
作者: 菇凉斋    时间: 2016-4-7 02:08
顶一个,基哥赞哒...
作者: 小白想学javaEE    时间: 2016-4-7 13:41
这个好,有代码才直接
作者: 菇凉斋    时间: 2016-4-8 23:06
顶贴顶贴喽!!!!!!!!1
作者: 蒂尔    时间: 2016-4-17 15:03
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2