(十二)网络图片查看器(注释更全面)

(一)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.xm<l文件<LinearLayout 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: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" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3" />

    <EditText
        android:id="@+id/et_path"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="http://f.hiphotos.baidu.com/image/pic/item/95eef01f3a292df535a659dabe315c6035a8739c.jpg"
        android:hint="请输入网络图片的地址" />

    <Button
        android:text="浏览"
        android:id="@+id/bt_setImageView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:onClick="click" />

</LinearLayout>(三)MainActivity.java源码:
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加入权限: <uses-permission android:name="android.permission.INTERNET" />

(六)需要注意的地方:

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

2、访问网络需要权限。

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

 
时间: 2024-10-13 21:51:19

(十二)网络图片查看器(注释更全面)的相关文章

android 网络_网络图片查看器

xml <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="

无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下: private static final Uri URI = Uri.parse("content://person.db"); public class

【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目

备份短信和添加短信 操作系统短信的uri: content://sms/ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.backupsms" android:versionCode="1

android---利用android-async-http开源项目实现网络图片查看器

1.   导包:导入android-async-http开源项目的最新版本的包 2.简单的搭建一个网络图片查看器的界面 相关的界面搭建代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent

网络图片查看器

如何使用安卓程序实现图片的异步图片加载,网络上传,网络查看.本届需要涉及到官员桌处理机制的问题,请参考 http://www.cnblogs.com/xuyinghui/p/4589701.html 1:下面是该程序的效果图: 在文本框中输入图片的路径,点击浏览按钮的同时,将会在上方的ImageView中显示出来该图片. 想要实现上面的程序,需要在按钮的点击事件中,在MainActivity的初始代码: 1 public void viewImage(View view) 2 { 3 Strin

第十二章 遍历器

遍历器(Iterator)的作用是按照指定的顺序来访问一个集合中的所有元素,而不需要了解集合的详细数据结构. 1 概述 1.1 foreach语句 这种遍历方式对任何类型的数据都适用,因为所有数组都继承了.NET类库中定义的类System.Array,而该类继承了接口IEnmerable.在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable<T>,或者继承了泛型接口IEnumerable<T>的任何一个构造类型,那么称该类型是“可枚举的”

学习mongo系列(十二)修改器($inc/$set/$unset/$push/$pop/upsert)

对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新.更新修改器是中特殊的键,用来指定复杂的操作,比如增加.删除或者调整键,还可能是操作数组或者内嵌文档.1.$inc > db.b.insert({"uid":"201603","type":"1","size":10})WriteResult({ "nInserted" : 1 }

android网络图片查看器

package com.itheima.netimageviewer; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; imp

第十二章 类加载器和反射机制

12 类加载器和反射机制 12.1 类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象. 1.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化三个步骤来实现对这个类的初始化. 加载 就是指将calss文件读入到内存,并为之穿件一个Class对象. 任何类被使用时系统都会建立一个Class对象. 连接 验证    是否有正确的内部结构,并和其他类协调一致 准备    负责为类的静态成员分配内存,并设置默认初始化值 解析    将类