黑马程序员技术交流社区
标题: 【济南中心】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 |