本文内容

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

本文演示 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;
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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);
                }
            }
        }
    };
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

授权 Android 访问网络权限

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

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

若直接在 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);
    }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

下载 Demo

最新文章

  1. fir.im Weekly - 揭秘直播移动 APP 技术实现
  2. XSD笔记
  3. debugging tools
  4. 【转】Nginx系列(三)--管理进程、多工作进程设计
  5. 用 JMH 检测 Lambdas 序列化性能
  6. BS和CS对比
  7. Keys of HashMap in Java
  8. Seafile的手册
  9. HDU 2451 Simple Addition Expression(组合数学)
  10. MySQL性能优化的最佳21条经验【转载】
  11. WPF之DataGrid的LoadingRow事件
  12. MySQL中的float和decimal类型有什么区别
  13. mysql 的mgr集群
  14. MyBatis DTD文件下载地址
  15. 画PCB之电流与线宽的关系
  16. Thrift-0.10.0 CenOS 7 编译错误 error: expected &#39;)&#39; before &#39;PRIu32&#39;
  17. mysql的查询使用explain的讲解
  18. Windows10安装vmware和centos7
  19. JAVA Socket编程和C++ Socket编程有什么不同
  20. 使用VS2017新建的Web项目报错:Package Microsoft.Composition 1.0.27 is not compatible with netcoreapp1.1

热门文章

  1. kernel logo到开机动画之间闪现黑屏(android 5.X)
  2. Revit API修改链接文件房间边界
  3. 多个RS-485设备怎么连接到一台电脑上?可以设置地址,有协议
  4. 项目从.NET 4.5迁移到.NET 4.0遇到的问题
  5. ASIHTTPRequest系列(一):同步和异步请求
  6. 声卡由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。(代码 19),
  7. 手机端可以和PC端同时在线-java QRCode 实现网站扫码登录(即支持同帐号多设备同时登录)
  8. 关于spring session redis共享session的跨子域的处理
  9. fabric-ca-server
  10. Can&#39;t create pdf file with font calibri bold 错误解决方案