A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 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




47 个回复

倒序浏览
回复 使用道具 举报

回帖奖励 +1 黑马币

学习学习!!!
回复 使用道具 举报

回帖奖励 +1 黑马币

向老师学习!
回复 使用道具 举报

回帖奖励 +1 黑马币

还好,学习了哦
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

很详细啊,不错
回复 使用道具 举报

回帖奖励 +1 黑马币

赞一个,,,,
回复 使用道具 举报

回帖奖励 +1 黑马币

弱弱的问下,英语单词是怎么背下来的,是一遍遍敲完记下来的么?
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

️ (  ︎ー︎  ) balalala~
 /      \
  /     ○   \
/  /        ヽ   \大白
| /       \ |
\Ԏ         Ԏ/
 卜−     ―イ
   \  /\    /
   ︶    ︶

来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

济南好给力
回复 使用道具 举报

回帖奖励 +1 黑马币

学习学习,谢谢老师
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报

回帖奖励 +1 黑马币

支持支持。顺别带走点黑马币
回复 使用道具 举报

回帖奖励 +1 黑马币

向老师学习
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

顶顶贴 加加油
回复 使用道具 举报
回复 使用道具 举报

回帖奖励 +1 黑马币

学习学习,支持
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

学习一下
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

先了解一下,感谢分享的
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报

回帖奖励 +1 黑马币

也想学这个 先攒些资料
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马