本文内容

  • 环境
  • 演示显示网络图片

本文演示 Android 如何显示网络图片。学习一门新的语言,最好办法就先了解该语言的语法和库,以及设计思想,再着手现实一些常用功能,毕竟以后用该语言是要写程序的,而程序说白了,就是一个个功能点。

环境


  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.3
  • 三星 SM-G3508,Android OS 4.1

演示显示网络图片


利用一个新线程加载并显示网络图片,并使用 handler 传递消息,若无异常,则用 Toast 现实“加载图片….”,否则,若网络图片不存在,显示“图片不存在”。同时,自定义一个类 HttpUtils,负责用 HTTP 访问网络。Android 程序如下图所示。

图 1

XML 页面文件略,只是添加 ImageView 和 Button 控件,核心代码如下:

自定义 HttpUtils 类

使用 HTTP 协议访问网络图片。

package com.example.viewwebimagedemo.utils;
    
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
    
public class HttpUtils {
    
    private final static String URL_PATH = "http://images.cnblogs.com/cnblogs_com/liuning8023/588559/o_Android.jpg";
    
    public HttpUtils() {
        // TODO Auto-generated constructor stub
    }
    
    public static InputStream getImageViewInputStream() throws IOException {
        InputStream inputStream = null;
    
        URL url = new URL(URL_PATH);
        if (url != null) {
            HttpURLConnection httpURLConnection = (HttpURLConnection) url
                    .openConnection();
            httpURLConnection.setConnectTimeout(3000);
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setDoInput(true);
            int response_code = httpURLConnection.getResponseCode();
            if (response_code == 200) {
                inputStream = httpURLConnection.getInputStream();
            }
        }
        return inputStream;
    }
}

MainActivity 类

负责加载并显示网络图片。

package com.example.viewwebimagedemo;
    
import java.io.InputStream;
    
import com.example.viewwebimagedemo.R;
import com.example.viewwebimagedemo.utils.HttpUtils;
    
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
    
public class MainActivity extends Activity {
    private Button button;
    private ImageView imageView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        button = (Button) this.findViewById(R.id.btn);
        imageView = (ImageView) this.findViewById(R.id.imageView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(access).start();
            }
        });
    }
    
    // 获得图片
    public void getImg() {
        try {
            InputStream inputStream = HttpUtils.getImageViewInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            Looper.prepare();// 必须调用此方法,要不然会报错
            Message msg = new Message();
            msg.what = 0;
            msg.obj = bitmap;
            handler.sendMessage(msg);
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "获取图片错误", 1).show();
        }
    }
    
    // 加载图片
    private void setImg(Bitmap bm) {
        imageView.setImageBitmap(bm);
    }
    
    // 另一个线程从网络获得图片
    private Runnable access = new Runnable() {
        @Override
        public void run() {
            getImg();
        }
    };
    // 更新UI信息
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                if (msg.obj == null) {
                    Toast.makeText(getApplicationContext(), "图片不存在", 1).show();
                } else {
                    Toast.makeText(getApplicationContext(), "加载图片...", 1)
                            .show();
                    setImg((Bitmap) msg.obj);
                }
            }
        }
    };
}

授权 Android 访问网络权限

修改 AndroidManifest.xml 文件,添加授权 Android 访问网络的权限。

    <uses-permission android:name="android.permission.INTERNET" />

若直接在 Activity 的 onCreate 事件里加载并显示图片,如下所示:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        // 假设已经从网络获得 bitmap
        imageView = (ImageView) this.findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);
    }

会报 android.os.NetworkOnMainThreadException 异常。因为,Android 4.x 之后,不允许在主线程进行网络访问。

下载 Demo

更多相关文章

  1. Android中的几种网络请求方式详解
  2. Android(安卓)TextView文字横向自动滚动(跑马灯)
  3. Android(安卓)Recovery Ui 分析
  4. 在控件的任意位置显示图片
  5. android异步网络连接开源:Android(安卓)Asynchronous Http Client
  6. Android(安卓)网络连接——URLConnection
  7. [置顶] 我的Android进阶之旅------>Android之选项卡(TabHost)的
  8. android启动界面说明
  9. android textview 中超出屏幕宽度的字符 省略号显示

随机推荐

  1. Invoke-customs are only supported star
  2. 系统关闭GPRS数据流量和 GPS的方法
  3. 8.1Launcher3 Google搜索框 往上移或者去
  4. Android 自定义布局控件-圆形RelativeLay
  5. Android(安卓)说说网络编程
  6. Android 7.0 网络变化监听
  7. android 获取设备上安装的非系统应用信息
  8. Android Studio error: Cannot start int
  9. 安卓 文本 滑动 android text slide
  10. androidscreencast 屏幕录像