(十二)handler消息处理机制-创新互联

(一)android:layout_weight 在不同情况下的意义。

创新互联是一家集网站建设,袁州企业网站建设,袁州品牌网站建设,网站定制,袁州网站建设报价,网络营销,网络优化,袁州网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

   当 android:layout_width  和 android:layout_height都不为0的时候,android:layout_weight代表的是控件渲染的优先级,值越大,渲染的优先级越低。默认android:layout_weight=0。

   当 android:layout_width  或 android:layout_height为0的时候,android:layout_weight才代表权重,值越大,权重越大。

(二)网络图片查看器的功能需求:根据给定的URL地址,去访问网络获取图片, 将获取的图片显示在界面中。程序界面运行如下:

(三)网络图片查看器的activity_main.xml文件

    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="com.example.networkviewimage.MainActivity" >

    

    

    
package com.example.networkviewimage;

import java.io.InputStream;
import java.net.HttpURLConnection;

import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
protected static final int CHANGE_UI = 1;
protected static final int ERROR = 2;
public ImageView iv;
public EditText et_path;

// 创建消息处理器  private Handler handler = new Handler() {

        @Override
public void handleMessage(Message msg) {
            
switch (msg.what) {
case CHANGE_UI:
                iv.setImageBitmap((Bitmap) msg.obj);
break;
case ERROR:
                Toast.makeText(MainActivity.this, "获取图片失败", 0).show();
break;

            }
        }

    };

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv= (ImageView) this.findViewById(R.id.iv);
        et_path= (EditText) this.findViewById(R.id.et_path);
    }

public void click(View v) {
final String path = et_path.getText().toString().trim();
if (TextUtils.isEmpty(path)) {
            Toast.makeText(this, "网络图片的路径不能为空", 0).show();
        }else {
// 连接服务器,获得图片。由于访问网络是个耗时的错误,所以必须在子线程中访问网络(在androi4.0以上的特性) new Thread(new Runnable() {

                @Override
public void run() {
// TODO Auto-generated method stub   try {

                        URL url= new URL(path);
// 根据url发送http请求                        HttpURLConnection conn = (HttpURLConnection) url
                                .openConnection();

                        conn.setConnectTimeout(5000); // 设置连接的超时时间                        conn.setReadTimeout(5000); // 设置读数据的超时时间                        conn.setRequestMethod("GET"); // 设置请求方式 int code = conn.getResponseCode(); // 得到服务器返回的响应码,200代表0K,404代表资源没有找到,503代表服务器内部错误 if (code == 200) {
                            InputStream is= conn.getInputStream(); // 从服务器获得的数据流,在此为从服务器获得图片                            Bitmap bitmap = BitmapFactory.decodeStream(is); // 把流里面内容转化为Bitmap
// iv.setImageBitmap(bitmap);
// 告诉主线程,帮我更改界面,内容是bitmap                            Message msg = new Message();
                            msg.what= CHANGE_UI;   
                            msg.obj= bitmap;

                            handler.sendMessage(msg);

                        }else {

                            Message msg= new Message();
                            msg.what= ERROR;

                            handler.sendMessage(msg);
                        }

                    }catch (Exception e) {
// TODO Auto-generated catch block                        e.printStackTrace();
                        Message msg= new Message();
                        msg.what= ERROR;
                        handler.sendMessage(msg);
// Toast.makeText(MainActivity.this, "获取图片失败",
// 0).show();  土司也是UI,如果执行catch直接弹出Toast会出错                    }
                }
            }).start();
        }

    }
}

(五)由于需要访问网络,所以需要在AndroidManifest.xml加入权限: 

(六)需要注意的地方:

  1、访问网络是个耗时间的操作,必须在子线程执行。

  2、访问网络需要权限。

  3、UI操作只能在主线程执行,如果子线程要修改UI,则通过handler消息处理机制,首先在主线程创建一个消息处理器handler对象,然后子线程通过消息处理器handler发送一个消息给主线程,消息按时间顺序从小到大将被放在主线程的消息队列里面,主线程里面有一个looper消息的轮询器,如果轮询器发现了消息,则调用handlerMessage方法处理消息。大概原理机制如下图所示:


分享题目:(十二)handler消息处理机制-创新互联
新闻来源:http://ybzwz.com/article/dcjjoo.html