android网络编程之初体验

来源:互联网 发布:传智播客java全套视频 编辑:程序博客网 时间:2024/05/22 09:47

今天刚刚开始看网络编程的内容,所以把今天看到的东西进行一下总结和记录。实例是根据在EditText中输入的网址从而通过按钮进入到这个网页中。

一、概述
            网络编程是当今app开发必不可少的一项内容,即使app是本地软件,在无网络的时候可以使用,但是在后期有版本的升级和一旦有网便会进行广告推广,所以网络编程时必不可少的一项。
二、编程思想

         1、  在这个实例中,会涉及到三个控件,所以先把这三个控件进行编写和布局。
         2、 在mainActivity中找到这三个控件,在这里EditText和TextView两个控件要设计成成员变量,因为在后期要在try中进行读取EditText的内容和重写TextView的内容,如果不设成成员变量的话将会无法直接取得。
        3、 设置按钮点击事件,点击之后进入到设定的网页中。
        4、 在按钮的监听中要想进入到用户输入的网页中,主要就是网络请求的代码。网络请求的设计思想如下:
           (1)定义一个url对象
           (2)创建一个urlconnection对象
           (3)设置一些connection的参数,包括超时时间,请求方式
           (4)将数据读取到一个有效的位置
           (5)将读取到的数据放到TextView中
       
 public void onClick(View v) {      //这个是没有使用子线程的事例,下边会改进使用子线程,并且会说明为什么要要子线程        String url = et_url.getText().toString().trim();        if (TextUtils.isEmpty(url)){            Toast.makeText(this,"访问的地址不对",Toast.LENGTH_LONG).show();            return;        }        try {            //1。定义一个URl对象            URL get_url = new URL(url);            //2。创建一个urlconnection对象            HttpURLConnection urlConnection = (HttpURLConnection)get_url.openConnection();            //3。设置一些connection的参数,包括超时时间,请求方式            urlConnection.setRequestMethod("GET");            urlConnection.setReadTimeout(1000*10);  //10秒            int responseCode = urlConnection.getResponseCode();            //4将数据读取读取到一个有效的位置            if (responseCode == 200){                InputStream inputStream = urlConnection.getInputStream();                String result = Utils.streamtostring(inputStream);                tv_display.setText(result);            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        finally {        }    }
在读取数据的时候是用到了HttpUrlConnection对象的一个方法getInputStream(),从而得到了一个字节输入流,流是不能直接显示在TextView中的,因此需要将流转化成字符串,在这里将这个方法封装到了一个方法中。
public class Utils {    //创建一个字节数组的字节输出流    static ByteArrayOutputStream array_out = new ByteArrayOutputStream();    public static String streamtostring(InputStream inputStream) {        String result = null;        byte[] buffer = new byte[1024];        int lenth = 0;        try {            while((lenth = inputStream.read())!=-1){                array_out.write(buffer,0,lenth);                array_out.flush();            }        } catch (IOException e) {            e.printStackTrace();        }        result = array_out.toString();        return result;    }}

三、Handler消息机制问题:
       在安卓中,涉及到网络请求、大容量的数据的传输以及数据库等耗时操作时,就不能在主线程中进行(注:如果在主线程中进去网络请求,网速不是很好的话,会在5秒的时候进行ANR提示,在android4.0之后,强制要求要将网络请求放在子线程中),要新开辟一个子线程来实现这些耗时操作。但是现在又出现了另外一个问题就是子线程是不安全的,所以不能再子线程中进行UI的更新,所以UI的更新要在主线程中进行。而我们子线程的数据又如何能够让主线程进行使用呢?这里就引出了Handler消息机制,他的目的就是将子线程的数据传至主线程中进行UI的更新。
       Handler消息机制开发的流程和思路:
             在主线程的开发:
                 创建一个Handler对象,采用匿名内部类的形式,然后将HandlerMessage方法进行重写,这个方法是必须重写的,目的就是接收来自子线程的数据。
            在子线程的开发:
                 子线程中要创建一个Message对象,用来拿到子线程的数据,从而将子线程的数据传给主线程。
 //在主线程中创建一个Handler对象private Handler handler = new Handler(){        //2重写handlermessager方法,用来接收子线程中发来的消息    @Override    public void handleMessage(Message msg) {        String result = (String) msg.obj;   //子线程中的数据已经放到了Message的obj属性中了        tv_display.setText(result);    }        //3在子线程中操作};

 Message message = new Message();    message.obj = result;    handler.sendMessage(message);
四、handler消息机制的原理:
       在安卓的应用中,主线程不适合处理耗时的操作,由子线程完成,而UI的更新需要主线程完成,这个消息的传递依靠handler的消息机制。而他的原理是什么呢?
    
           在子线程中有Message信息,然后通过handler的sendMessage方法发送到主线程中的MessageQueue(消息队列),所有的来自子线程的消息Message都会存储到这个队列中,然后通过主线程中的looper(信息循环器)一直对MessageQueue进行检索,如果发现出现了新的Message,就会把新的消息交给Handler进行处理,直接更新UI。

           
0 0
原创粉丝点击