网络交互——实现从服务器获取文件(例如:图片)

来源:互联网 发布:战地mac版 编辑:程序博客网 时间:2024/04/30 02:08

网络交互——实现从服务器获取文件(例如:图片)

一   需求:创建一个Tomcat服务器, 实现从Tomcat服务器中获取一张图片显示在界面中


涉及到的问题:

1:Android在4.x版本之后就限制了在主线程不能执行联网操作

会抛出异常

处理方式:


2:子线程不能直接操作界面,所以要用到消息机制Handler

2-1:当子线程在操作界面时抛出异常



3:Handler消息处理机制





实现步骤:

主线程中:

找到组件ImageView

1.1 创建消息处理器,在主线程用于处理子线程发来的消息并且判断唯一标识是否正确

Handler :消息处理机制,一个处理程序允许你发送和线程消息队列中的消息和Runnable对象关联的进程。

public void handleMessage(Message message) 方法:重写该方法实现接收消息,子类必须实现此接收消息。

1.2 点击方法中:

开线程

new Thread(){public void run(){

1.2.1URL获取网络图片

URL:统一资源定位符;统一资源定位符标识一个互联网资源的位置由RFC 1738指定。

1.2.2打开连接OpenConnection()

URLConnection:一个连接到一个网址读写。

HttpURLConnection:HTTP的一个URLConnection(RFC 2616)用于通过网络发送和接收数据。数据可以是任何类型和长度。这个类可以用来发送和接收数据流的数据,其长度不是预先已知的。

1.2.3设置连接超时5秒
urlConnection.setConnectTimeout(5000);

1.2.4设置请求方式为get请求,也可以是post
urlConnection.setRequestMethod("GET");
1.2.5判断响应是否成功(只要获取响应对象里面的内容才会向服务器发送请求)

getResponseCode():从 HTTP 响应消息获取状态码。例如,就以下状态行来说:

if (urlConnection.getResponseCode() == 200) {

 HTTP/1.0 200 OK

 HTTP/1.0 401 Unauthorized

将分别返回 200 和 401。如果无法从响应中识别任何代码(即响应不是有效的 HTTP),则返回 -1。

1.2.6获取服务器返回的数据
InputStream inputStream = urlConnection
.getInputStream();
1.2.7把流处理
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
1.2.8发送消息给主线程
Message message = new Message();
message.what = LOAD_DATA_SUCCESS;// 消息的唯一标识
message.obj = bitmap;// 消息携带的数据
mHandler.sendMessage(message);// 送消息给Handler


Message :消息对象,定义包含一个描述和可以发送给处理程序的任意数据对象的消息。这个对象包含了两个额外的int字段和一个额外的对象领域,允许你在很多情况下不用做分配。

}}.start();

1.3

清单文件中加网络权限。



具体代码实现: 

1:界面实现:两个组件

             Button——设置:getdraw点击方法     

             ImageView

            界面代码:

            <Button 

                     android:id="@+id/bt_getdraw"

                     android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="getdraw"

        android:text="获取网络图片" />

<ImageView

        android:id="@+id/iv_draw"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

 

2创建一个Tomcat服务器

 

3MainActivity实现代码:

public class MainActivity extends ActionBarActivity {


private ImageView iv;
//自定义的常量
private static final int LOAD_DATA_SUCCESS = 0;
private static final int LOAD_DATA_ERROR = 1;


// 消息处理器,在主线程用于处理子线程发来的消息
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case LOAD_DATA_SUCCESS://加载网络成功
Bitmap bitmap = (Bitmap) message.obj;//获取消息Message
iv.setImageBitmap(bitmap);


break;
case LOAD_DATA_ERROR://加载失败
Toast.makeText(MainActivity.this, "加载失败", 0).show();
break;


default:
break;
}
}
};


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到ImageView组件
iv = (ImageView) findViewById(R.id.iv_draw);


}


public void getdraw(View v) {
new Thread() {
// 开启线程 肯定是子线程
public void run() {

// 图片地址 String pathString =
// "http://localhost:8080/ServerWebTomcat/53452def306f2c0e-612201abc104d959-3ede4290fffccf6cca84481261796c59.jpg";
// 不能直接访问图片地址,要先访问模拟器
// 访问模拟器 192.168.191.1(本机ip地址) 还有一种写法:10.0.2.2
// 如果真机访问Tomcat 有条件:手机与电脑必须在网络中(无线局域网 wifi)
// 端口port:8080
try {
String pathString = "http://192.168.191.1:8080/ServerWebTomcat/53452def306f2c0e-612201abc104d959-3ede4290fffccf6cca84481261796c59.jpg";
// 获取网络图片
URL url = new URL(pathString);
// 打开连接 获取连接对象
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
// 设置连接超时5秒
urlConnection.setConnectTimeout(5000);
// 设置请求方式为get请求
urlConnection.setRequestMethod("GET");
// 判断响应是否成功(只要获取响应对象里面的内容才会向服务器发送请求)
if (urlConnection.getResponseCode() == 200) {
// 获取服务器返回的数据
InputStream inputStream = urlConnection
.getInputStream();
// 把流处理
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
// 发送消息给主线程
Message message = new Message();
message.what = LOAD_DATA_SUCCESS;// 消息的唯一标识
message.obj = bitmap;// 消息携带的数据
mHandler.sendMessage(message);// 送消息给Handler
} else {
alertUserLoadError();
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}


/*
* 获取网络图片失败
*/
private void alertUserLoadError() {
// 吐司也是在操作界面
// 所以发送空消息(没有obj对象),将吐司在主线程处理
mHandler.sendEmptyMessage(LOAD_DATA_ERROR);
}


4:manifest清单文件中添加网络权限



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机百度网盘本地空间不足怎么办 百度网盘保存视频内存不够怎么办 别人的百度网盘链接打不开怎么办 百度网盘视频插件升级失败怎么办 退苹果id重新登陆照片没了怎么办 苹果升级后照片效果没了怎么办 360云盘个人云盘停止服务怎么办 小米手机账号掉了手机卡没了怎么办 百度网盘下载后不能注册怎么办 微信发出的文件无法撤回怎么办 微信群发错消息无法撤回怎么办 百度网盘登录要验证码怎么办 百度网盘备份记录怎么办能删掉 手机酷狗听歌耳机声音太小了怎么办 苹果6s微信通话声音变粗怎么办 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办