博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android之网络操作(1)
阅读量:6829 次
发布时间:2019-06-26

本文共 4131 字,大约阅读时间需要 13 分钟。

一、网络操作


在网络操作中JAVA已经为我提供了一套API用来进行网络操作,在android开发中我们仍可以这套API来做开发。下面通过一个简单的例子来了解一下android下的网络操作。

点击图中下载按钮从服务器上下载一张图片下来

二、xml布局文件


布局文件采用线性布局,只使用到一个button和一个image

 

三、MainActivity.java


  在代码中当点击事件发生后,就通过通过URL来创建一个HttpURLConnection对象来向服务器建立连接,发起HTTP请求。当请求成功后,表明数据已经在内存中。这时,我们应该从内存中拿到数据并将其封装成一个bitmap对象,这个对象是android提供的,专门用来将从互联网上download的图片直接显示。这些操作我们都放在子线程中,一个原因是google要求必须这样,另一方面如果把耗时操作放在主线程(也就是UI线程)中,会引起主线程阻塞,这样显示界面会卡死。

package xidian.dy.com.chujia;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity {    private static ImageView img;    static  MainActivity ma;    static Handler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btn = (Button) findViewById(R.id.btn);        ma = this;        handler = new Handler(){            @Override            //此方法在主线程中刷新UI            public void handleMessage(Message msg) {                if(img != null){                    if(msg.what == 0)                        img.setImageBitmap((Bitmap)msg.obj);                    else                        Toast.makeText(ma,"图片下载失败",Toast.LENGTH_SHORT).show();                }            }        };        if(btn != null)            btn.setOnClickListener(new MyLister());    }    class MyLister implements View.OnClickListener{        @Override        public void onClick(View v) {            img = (ImageView) findViewById(R.id.img);            new Thread(){                @Override                public void run() {                    try {                        URL url = new URL("http://192.168.0.119/dog.jpg");                        //创建连接对象                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();                        //设置请求方式                        conn.setRequestMethod("GET");                        //设置TCP连接超时                        conn.setConnectTimeout(5000);                        //设置http响应超时                        conn.setReadTimeout(5000);                        //建立连接                        conn.connect();                        Message msg = handler.obtainMessage();                        if(conn.getResponseCode() == 200){                            InputStream is = conn.getInputStream();                            Bitmap bm = BitmapFactory.decodeStream(is);                            msg.what = 0;                            msg.obj = bm;                            handler.sendMessage(msg);                        }                        else {                            msg.what = 1;                            handler.sendMessage(msg);                        }                        Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }.start();        }    }}

   在MainAactivity中创建一个handler对象是用于可子线程进行数据交互的。主线程在创建的时候,系统会同时创建消息队列对象(MessageQueue)和消息轮询器对象(Looper)线程,轮询器的作用就是不停的检查消息队列中是否有消息,消息队列一旦有消息,轮询器会把消息对象传递给Handler,并调用handler的dispatcherMessage方法。

public void dispatchMessage(Message msg) {        if (msg.callback != null) {            handleCallback(msg);        } else {            if (mCallback != null) {                if (mCallback.handleMessage(msg)) {                    return;                }            }            handleMessage(msg);        }    }

在dispachMessage中会调用我们的handleMessage方法。、

修改配置文件


在配置文件中我们要赋予app访问网络的权限

转载于:https://www.cnblogs.com/xidongyu/p/5612545.html

你可能感兴趣的文章
获取iOS系统版本号,慎重使用[[[UIDevice currentDevice] systemVersion] floatValue]——【sdk缺陷】...
查看>>
秀尔算法:破解RSA加密的“不灭神话” --zz
查看>>
Redis学习之路(003)- hiredis安装及测试
查看>>
【剑指offer】近期公共祖先
查看>>
剑指offer 38 数字在排序数组中出现的次数
查看>>
[Python] How to unpack and pack collection in Python?
查看>>
iOS 隐藏NavigationBar的方法
查看>>
最新.net和Java调用SAP RFC中间件下载
查看>>
(转)淘淘商城系列——导入商品数据到索引库
查看>>
Hibernate(十一):映射继承关系的三种方案
查看>>
oracle数据库使用之数据查询入门
查看>>
通过cat方式生成yum源
查看>>
属性动画的概念解析--实现星星控件
查看>>
java之JMX
查看>>
指针常量与常量指针
查看>>
在web.config中配置httpHandlers节点是的说明
查看>>
c++:数据类型的推断type_traits
查看>>
物理结构与逻辑结构
查看>>
Storm工作流程
查看>>
Opencv探索之路(十九):读写xml和yml文件
查看>>