黑马程序员技术交流社区

标题: 【济南中心】Android课程同步笔记day04:Android应用开发基础 [打印本页]

作者: 小鲁哥哥    时间: 2016-11-19 16:50
标题: 【济南中心】Android课程同步笔记day04:Android应用开发基础
本帖最后由 小鲁哥哥 于 2016-11-21 10:42 编辑


【济南中心】Android课程同步笔记day04:Android应用开发基础

获取网络数据的步骤
首先一定要记得加联网权限<uses-permission android:name="android.permission.INTERNET"/>
[Java] 纯文本查看 复制代码
// 1.得到图片的url路径
URL url = new URL(url_path);
// 2.通过路径打开一个http的连接,并设置请求参数
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// http
// 3.得到响应码,判断与服务器连接是否正常
int code = conn.getResponseCode(); // 200 OK 404 资源没找到 503服务器内部错误
if (code == 200) {
// 4.得到服务器返回的数据流
InputStream is = conn.getInputStream();
}

下面举个简单的联网应用的例子
获取网络图片布局
[XML] 纯文本查看 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_url"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入url" />

    <Button
        android:id="@+id/bt_lookpic"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="获取图片" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/img_pic"
            android:layout_width="fill_parent"
            android:layout_height="match_parent" />
    </ScrollView>

</LinearLayout>

代码如下:
[Java] 纯文本查看 复制代码
public class MainActivity extends Activity {

        private EditText mEtUrl;
        private Button mBtLookpic;
        private ImageView mIvPic;
        private Context mContext = this;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                initView();
                initListener();
        }

        /**
         * 初始化控件
         */
        private void initView() {
                // 找控件
                mEtUrl = (EditText) findViewById(R.id.et_url);
                mBtLookpic = (Button) findViewById(R.id.bt_lookpic);
                mIvPic = (ImageView) findViewById(R.id.img_pic);
        }

        /**
         * 初始化监听器
         */
        private void initListener() {
                // 设置点击事件
                mBtLookpic.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                                // 获取用户输入的url
                                final String url = mEtUrl.getText().toString().trim();
                                if (TextUtils.isEmpty(url)) {
                                        Toast.makeText(mContext, "url不能为空", 0).show();
                                        return;
                                }
                                // 请求url地址获取源码内容
                                // 创建子线程去请求网络
                                new Thread(new MyTask(url)).start();

                        }
                });
        }

        /**
         * 执行任务
         *
         * @author Somnus
         *
         */
        class MyTask implements Runnable {
                String mUrl;
                public MyTask(String url) {
                        this.mUrl=url;
                }

                @Override
                public void run() {

                        try {
                                // 1.创建Url对象。
                                URL url = new URL(mUrl);
                                // 2.通过Url获取一个HttpUrlConnection对象
                                HttpURLConnection openConnection = (HttpURLConnection) url
                                                .openConnection();
                                // 3.为HttpUrlConnection对象设置请求方式,联网的超时时间
                                openConnection.setRequestMethod("GET");// 请求方式必须大写
                                openConnection.setConnectTimeout(10 * 1000);// 设置超时时间
                                // 4.获取服务器的响应码,判断是否是200
                                int code = openConnection.getResponseCode();
                                if (code == 200) {
                                        // 5.是200,获取流信息,
                                        InputStream inputStream = openConnection.getInputStream();
                                        // 6.将流信息转换成Bitmap bitmap:位图
                                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);// 使用BitmapFactory可以将各种资源(文件,流,字节数组)转换成Bitmap对象                                
                                        inputStream.close();
                                        mIvPic.setImageBitmap(bitmap);
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                        }

                }
        }
}


ANR异常
可以看到我们把联网的操作放到了子线中,如果我们联网操作放到了主线程中运行就会导致主线程阻塞导致ANR异常。
ANR全称为Application Not Response 应用程序无响应,一个应用的主线程(又叫UI线程),负责的事情较多,如消息的监听、界面的更新。如果主线程被阻塞,会让整个应用卡住。如果阻塞的时间过长,会导致ANR异常。
如果说我们的耗时操作需要放在子线称中,而在子线程中又不能更新UI界面,那这样是不是就有冲突了?所以谷歌引入了Handler消息机制。
Handler
Handler的使用;
1.主线程中创建一个Handler对象重写handler对象的handlerMessage方法
[Java] 纯文本查看 复制代码
private Handler handler = new Handler(){
                public void handleMessage(android.os.Message msg) {
                };
            };

2.子线程中创建一个message对象
我们通过Handler对上面的代码进行整改更新UI界面
[Java] 纯文本查看 复制代码
public class MainActivity extends Activity {

        private EditText mEtUrl;
        private Button mBtLookpic;
        private ImageView mIvPic;
        private Context mContext = this;
//        1.在主线程中创建一个Handler对象。
        //△△△△△2.实现Handler对象的handleMessage方法。
        private Handler handler = new Handler(){
                public void handleMessage(android.os.Message msg) {
                        //△△△△△6.主线程在handlermesssage方法中接受子线程发来的Message对象,并获取绑定结果数据,进行更新UI的处理
                        Bitmap bitmap = (Bitmap) msg.obj;
                        //将获取的bitmap显示到ImageView上。
                        mIvPic.setImageBitmap(bitmap);
                };
        };

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                initView();
                initListener();
        }

        /**
         * 初始化控件
         */
        private void initView() {
                // 找控件
                mEtUrl = (EditText) findViewById(R.id.et_url);
                mBtLookpic = (Button) findViewById(R.id.bt_lookpic);
                mIvPic = (ImageView) findViewById(R.id.img_pic);
        }

        /**
         * 初始化监听器
         */
        private void initListener() {
                // 设置点击事件
                mBtLookpic.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {

                                // 获取用户输入的url
                                final String url = mEtUrl.getText().toString().trim();
                                if (TextUtils.isEmpty(url)) {
                                        Toast.makeText(mContext, "url不能为空", 0).show();
                                        return;
                                }
                                // 请求url地址获取源码内容
                                // 创建子线程去请求网络
                                new Thread(new MyTask(url)).start();

                        }
                });
        }

        /**
         * 执行任务
         *
         * @author Somnus
         *
         */
        class MyTask implements Runnable {
                String mUrl;
                public MyTask(String url) {
                        this.mUrl=url;
                }

                @Override
                public void run() {

                        try {
                                // 1.创建Url对象。
                                URL url = new URL(mUrl);
                                // 2.通过Url获取一个HttpUrlConnection对象
                                HttpURLConnection openConnection = (HttpURLConnection) url
                                                .openConnection();
                                // 3.为HttpUrlConnection对象设置请求方式,联网的超时时间
                                openConnection.setRequestMethod("GET");// 请求方式必须大写
                                openConnection.setConnectTimeout(10 * 1000);// 设置超时时间
                                // 4.获取服务器的响应码,判断是否是200
                                int code = openConnection.getResponseCode();
                                if (code == 200) {
                                        // 5.是200,获取流信息,
                                        InputStream inputStream = openConnection.getInputStream();
                                        // 6.将流信息转换成Bitmap bitmap:位图
                                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);// 使用BitmapFactory可以将各种资源(文件,流,字节数组)转换成Bitmap对象
                                        inputStream.close();
                                        //△△△△△3.子线程中创建一个Message对象
                                        Message msg = new Message();
                                        //△△△△△4.将子线程中获取的数据绑定给Message对象
                                        msg.obj  = bitmap;
                                        //△△△△△5.使用主线程中的handler对象将子线程message对象发送到主线程
                                        handler.sendMessage(msg);

                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                        }

                }
        }
}
Android下的消息机制

Message:消息,其中包含了子线程想让主线程处理的数据,由Handler从子线程发送到主线程的MessageQueue中,终由Looper从MessageQueue中取出交给Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO(先进先出)规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的取出。
Looper:轮询器,不断地从MessageQueue中抽取Message交给Handler执行。

JSON格式JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
JSON 语法规则
    数据在键值对中
   数据由逗号分隔
    花括号保存对象
    方括号保存数组
JSON 值可以是
    数字(整数或浮点数)
    字符串(在双引号中)
    逻辑值(true 或 false)
    数组(在方括号中)    对象(在花括号中)
    null
JSON数据有两种结构
对象:表示为“{}”括起来的内容,数据结构为 {key:value, key:value, ...}
数组:表示为“[]”括起来的内容,数据结构为 ["java", "javascript", "vb", ...]
JSON数据格式的解析
JSONObject  和JSONArray





作者: 小情书    时间: 2016-11-19 19:18
挺不错的,易懂

作者: aA772807986    时间: 2016-11-21 11:03
学习学习!!!
作者: 橘子哥    时间: 2016-11-21 13:17
向老师学习!
作者: FAN8210    时间: 2016-11-22 22:26
还好,学习了哦

作者: 来到精彩世界    时间: 2016-11-28 23:10
很详细啊,不错
作者: javantiger93000    时间: 2016-11-29 12:13
赞一个,,,,
作者: z234942506    时间: 2016-12-9 21:59
弱弱的问下,英语单词是怎么背下来的,是一遍遍敲完记下来的么?

作者: 这就是我和id    时间: 2016-12-13 21:08
️ (  ︎ー︎  ) balalala~
 /      \
  /     ○   \
/  /        ヽ   \大白
| /       \ |
\Ԏ         Ԏ/
 卜−     ―イ
   \  /\    /
   ︶    ︶


作者: 孤独于我    时间: 2016-12-21 16:24
济南好给力
作者: 小虎同学    时间: 2016-12-22 15:47
学习学习,谢谢老师

作者: 小虎同学    时间: 2016-12-23 00:27
收下了,哈哈

作者: hgd5201314    时间: 2016-12-23 23:03
支持支持。顺别带走点黑马币
作者: 55555    时间: 2017-1-5 23:09
向老师学习

作者: Yin灬Yan    时间: 2017-1-9 18:29
顶顶贴 加加油
作者: 小虎同学    时间: 2017-1-17 18:51
不错不错

作者: 喝水喝饱了    时间: 2017-1-17 20:21
学习学习,支持

作者: 赵亚强    时间: 2017-1-20 17:51
学习一下

作者: ybp0076    时间: 2017-1-30 12:07
先了解一下,感谢分享的

作者: a690223483    时间: 2017-2-23 00:24
也想学这个 先攒些资料
作者: zhangkaitong    时间: 2017-2-24 13:24
谢谢分享 赞赞赞!!!!!
作者: xulinml    时间: 2017-2-28 09:06
好东西!谢谢分享!谢谢!!!
作者: 为过去的我买单    时间: 2017-3-2 09:58
谢谢分享!
作者: ys5214    时间: 2017-4-2 10:47
23333333333
作者: 轻风24    时间: 2017-4-3 00:23
一直在关注楼主的资料....
作者: 阿尔维斯    时间: 2017-4-14 14:44
厉害了,很好用
作者: 沈唁    时间: 2017-4-14 15:29
回帖涨经验
作者: Royal592    时间: 2017-4-14 19:09
可以啊!收藏收藏

作者: 剑桥子卿卿    时间: 2017-4-15 11:23
为何发表失败

作者: momomo    时间: 2017-4-15 18:26
看看                     
作者: wyn5130607    时间: 2017-5-1 12:59
哈哈哈

作者: hrywxn    时间: 2017-5-22 22:28
谢谢分享!
作者: Bowie-tan    时间: 2017-6-1 23:37
厉害了

作者: dhj    时间: 2017-6-9 11:39
快到碗里来,黑马币!!!
作者: dhj    时间: 2017-6-11 17:02
感谢无私分享!!!!
作者: dhj    时间: 2017-6-12 17:33
感谢分享~~~~
作者: a851699    时间: 2017-6-17 13:51
可以的 很强势

作者: 康大神    时间: 2017-6-25 21:58
都可以啊

作者: 444786228    时间: 2017-7-5 07:49
感谢分享

作者: str.arr    时间: 2017-7-9 10:03
哇。这波操作
作者: 梁修成    时间: 2017-7-10 22:42

笔记做的很详细,很认真...
作者: cheat    时间: 2017-7-10 22:48
感谢老师,谢谢分享。
作者: zhangyonghui    时间: 2017-7-17 01:31
66666666666

作者: rimfwfn    时间: 2017-8-2 23:14
现在anroid要技术大牛才行,赶紧学习
作者: k1453711238    时间: 2017-8-3 19:40
感谢分享!!!
作者: 花漾丶    时间: 2017-8-19 20:42
占层楼

作者: jwanzi    时间: 2018-2-23 11:13
学习了,多谢!
作者: baby14    时间: 2018-11-13 08:04
多谢分享




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