android 学习随笔七(网络:图片及文本传输及线程关系 )
- 主线程、子线程、UI的关系

- 简单的HTTP请求
--------------------------------------------------------
public class MainActivity extends Activity {
Handler handler = new Handler(){
//只要消息队列有消息,此方法就会在主线程执行
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
//刷新UI
//把下载的图片显示
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap((Bitmap)msg.obj);
break;
case 2:
Toast.makeText(MainActivity.this, "请求失败", 0).show();
break;
case 3:
Toast.makeText(MainActivity.this, "连接开始", 0).show();
break;
case 4:
Toast.makeText(MainActivity.this, "连接成功", 0).show();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Thread t= new Thread(){
@Override
public void run() {
//String path="http://192.168.1.106/adtest/11.jpg";
String path="http://10.0.2.2/adtest/11.jpg";
//发送HTTP请求
try {
//1.使用网址构造一个URL对象
URL url=new URL(path);
//获取连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置一些属性
//设置请求方式
conn.setRequestMethod("GET");
//设置请求超时
conn.setConnectTimeout(8000);
//设置读取超时
conn.setReadTimeout(8000);
handler.sendEmptyMessage(3);
//发送请求,建立连接
conn.connect();
handler.sendEmptyMessage(4);
//判断请求是否成功
if(conn.getResponseCode() == 200){
//获取服务器返回的流,流里就是客户端请求的数据
InputStream is = conn.getInputStream();
//读取流里数据,构造出一张图片
Bitmap bm = BitmapFactory.decodeStream(is);
//当子线程需要刷新UI时,只需发送一条消息至消息队列
Message msg = new Message();
//消息对象可以携带数据
msg.obj = bm;
//使用WHAT标注消息类型
msg.what = 1;
handler.sendMessage(msg);
}
else{
//如果消息不携带数据,可以用handler发空消息,不用创建Message
//如果消息池有消息,取出消息池第一条消息(复用空闲消息),返回,如果没有,就NEW一个消息返回
// Message msg = handler.obtainMessage();
// msg.what = 2;
// handler.sendMessage(msg);
handler.sendEmptyMessage(2);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
}
}
------------------------------------------------------------------------------------------
- 添加缓存机制
public class MainActivity extends Activity {
Handler handler = new Handler(){
//只要消息队列有消息,此方法就会在主线程执行
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
//刷新UI
//把下载的图片显示
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap((Bitmap)msg.obj);
break;
case 2:
Toast.makeText(MainActivity.this, "请求失败", 0).show();
break;
case 3:
Toast.makeText(MainActivity.this, "连接开始", 0).show();
break;
case 4:
Toast.makeText(MainActivity.this, "连接成功", 0).show();
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Thread t= new Thread(){
@Override
public void run() {
//String path="http://192.168.1.106/adtest/11.jpg";
//String path="http://10.0.2.2/adtest/11.jpg";
final String path="http://10.0.2.2";
final File file = new File(getCacheDir() + getFileNameFromPath(path));
if(file.exists()){
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//当子线程需要刷新UI时,只需发送一条消息至消息队列
Message msg = new Message();
//消息对象可以携带数据
msg.obj = bm;
//使用WHAT标注消息类型
msg.what = 1;
handler.sendMessage(msg);
//在主线程可以直接显示
// ImageView iv = (ImageView) findViewById(R.id.iv);
// iv.setImageBitmap((Bitmap)msg.obj);
}
else
{
//发送HTTP请求
try {
//1.使用网址构造一个URL对象
URL url=new URL(path);
//获取连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置一些属性
//设置请求方式
conn.setRequestMethod("GET");
//设置请求超时
conn.setConnectTimeout(8000);
//设置读取超时
conn.setReadTimeout(8000);
handler.sendEmptyMessage(3);
//发送请求,建立连接
//conn.connect();
//判断请求是否成功(请求时建立连接)
if(conn.getResponseCode() == 200){
handler.sendEmptyMessage(4);
//获取服务器返回的流,流里就是客户端请求的数据
InputStream is = conn.getInputStream();
//读取数据(1K),缓存数据
byte[] b = new byte[1024];
int len;
FileOutputStream fos = new FileOutputStream(file);
while((len = is.read(b)) != -1){
fos.write(b, 0, len);
}
fos.close();
//读取流里数据,构造出一张图片,缓存把流里的数据读完,流里已经没有数据了
//Bitmap bm = BitmapFactory.decodeStream(is);
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//当子线程需要刷新UI时,只需发送一条消息至消息队列
Message msg = new Message();
//消息对象可以携带数据
msg.obj = bm;
//使用WHAT标注消息类型
msg.what = 1;
handler.sendMessage(msg);
}
else{
//如果消息不携带数据,可以用handler发空消息,不用创建Message
//如果消息池有消息,取出消息池第一条消息(复用空闲消息),返回,如果没有,就NEW一个消息返回
// Message msg = handler.obtainMessage();
// msg.what = 2;
// handler.sendMessage(msg);
handler.sendEmptyMessage(2);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
};
t.start();
}
public String getFileNameFromPath(String path) {
int index = path.lastIndexOf("/");
return path.substring(index + 1);
}
}
------------------------------------------------------------------------------------------------------------
- 引用现成代码
https://github.com/loopj/android-smart-image-view
下载解压拷贝到工程中来
<RelativeLayout 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: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="com.ecollab.smartimageview.MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看网络图片"
android:onClick="click"
/>
<com.loopj.android.image.SmartImageView
android:id="@+id/siv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
-------------------------------------------------------------------------------
public void click(View v)
{
SmartImageView siv = (SmartImageView) findViewById(R.id.siv);
//请求网络图片
siv.setImageUrl("http://10.0.2.2:80/adtest/11.jpg");
}
- 文本查看器
------------------------------------------------------------------------------------------------
public class Tools {
public static String getTextFromStream(InputStream is)
{
byte[] b = new byte[1024];
int len;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
while((len = is.read(b)) != -1){
bos.write(b, 0, len);
}
//把字节数组输出流转换成字节数组,然后用字节数组构造一个字符串
String text = new String(bos.toByteArray());
//String text = new String(bos.toByteArray(),"gbk");
return text;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
--------------------------------------------------------------------------------------------
public class MainActivity extends Activity {
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText((String)msg.obj);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v)
{
final String path = "http://10.0.2.2:80/adtest/baidu.html";
Thread t = new Thread(){
@Override
public void run() {
URL url;
try {
//使用网址构造URL
url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
if(conn.getResponseCode() == 200){
InputStream is = conn.getInputStream();
String text = Tools.getTextFromStream(is);
Message msg = handler.obtainMessage();
msg.obj = text;
handler.sendMessage(msg);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
}
}
android 学习随笔七(网络:图片及文本传输及线程关系 )的更多相关文章
- android 学习随笔六(网络要求及配置)
android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程 只有主线程才能修改UI ANR异常:Applicat ...
- android 学习随笔九(网络:简单新闻客户端实现)
1.简单新闻客户端 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- android 学习随笔十一(网络:HttpClient框架)
1.使用HttpClient框架发送get.post请求 google收集apache提供的一个发送Http请求框架 public class Tools { public static String ...
- android 学习随笔十(网络:get、post提交数据)
1.get public class Tools { public static String getTextFromStream(InputStream is){ byte[] b = new by ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- (转)Android学习-使用Async-Http实现图片压缩并上传功能
(转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...
- 【Android】完善Android学习(七:API 4.0.3)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- Android学习随笔--ListView的分页功能
第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...
- Android学习总结——判断网络状态
package com.example.xch.broadcasttest; import android.content.BroadcastReceiver; import android.cont ...
随机推荐
- django 部署到 apache
安装完django之后,每次都需要通过命令来启动启动开发服务器.虽然调试和测试方便,但只能在本地运行,并且不能承受许多用户同时使用的负载.所以需要将Django部署到生产级的服务器,这里选择apach ...
- Spring AOP 实现原理与 CGLIB 应用
https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/ AOP(Aspect Orient Programming),也就是面向 ...
- net Datable 基本操作
net Datable 基本操作 using System; using System.Collections.Generic; using System.Text; using System.Dat ...
- iOS:集成ijkplayer视频直播
介绍: ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集 ...
- AWE、加载计数器错误
错误#1 16:28 2012-7-25数据库服务器A想开启下sql server 2000的AWE.结果发现在查询分析器中执行RECONFIGURE时报错.运行的语句为: sp_configure ...
- Web开发学习
这几天天天学习网络开发的一些东西,接触了好些概念.原本打算自己弄个个人博客,BlogEngine.net已经做的很好了,可以直接拿来用而且源码开放.做的很不错,是WebForm的.本来打算好好学习一下 ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
- bootstrap学习之一_bootstrap css
一.文本相关样式 文本格式(用于块状标签):text-left:向左对齐文本:text-center:居中对齐文本:text-right:向右对齐文本:text-justified;text-nowr ...
- Hadoop学习(1)-- 入门介绍
Hadoop是Apache基金会开发的一个分布式系统基础架构,是时下最流行的分布式系统架构之一.用户可以在不了解分布式底层的情况下,在Hadoop上快速进行分布式应用的开发,并利用集群的计算和存储能力 ...
- EBS R12.2安装,使用的操作系统用户
在安装时,错误使用了oracle rdbms的对应的操作系统用户,导致安装前,验证时"web server install prerequisites"选项验证失败: (本图其它两 ...