Android实战简易教程-第七十一枪(异步网络下载网络图片及图片廊制作)

首先来实现异步下载网络图片,布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_getpic"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="获取数图片" />

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

网络请求类,继承Thread:

package com.test.demo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.widget.ImageView;

public class LoadThread extends Thread {
	private String url;
	private Handler handler;
	private ImageView imageView;

	public LoadThread(String url, Handler handler, ImageView imageView) {
		this.url = url;
		this.handler = handler;
		this.imageView = imageView;
	}

	@Override
	public void run() {
		try {
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			URL conn = new URL(url);
			HttpURLConnection httpURLConnection = (HttpURLConnection) conn.openConnection();
			InputStream in = httpURLConnection.getInputStream();
			byte data[] = new byte[2 * 1024];
			int len = 0;
			while ((len = in.read(data)) != -1) {
				byteArrayOutputStream.write(data, 0, len);
			}
			final Bitmap bitmap = BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0,
					byteArrayOutputStream.toByteArray().length);
			handler.post(new  Runnable() {
				public void run() {
					imageView.setImageBitmap(bitmap);
				}
			});

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

		}

	}

}

构造方法需要传入请求的URL地址,ImageView控件和Handler对象,方便将结果返回到UI线程,覆写了run方法,并且在run方法中编写了网络请求的方法,最后调用Handler的post方法,将请求结果反映到UI的ImageView上。对网络请求IO部分不熟悉的同学可以学习一下这部分知识,编写套路都是固定的。

MainActivity.java:

package com.test.demo;

import com.example.testandroid.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Button btn;
	private ImageView img;
	private String url = "http://pic.yesky.com/uploadImages/2016/065/03/8VG0Q0HU97X3.jpg";
	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn = (Button) findViewById(R.id.btn_getpic);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				new LoadThread(url, handler, img).start();
			}
		});
		img = (ImageView) findViewById(R.id.img);
	}
}

注意--此应用需要配置网络权限。配置权限后运行项目如下:

下面可以添加一个向上和向下的按钮,实现图片切换,main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:layout_alignParentTop="true" />

    <Button
        android:id="@+id/btn_pre"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/img"
        android:text="上一张" />

    <Button
        android:id="@+id/btn_next"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/img"
        android:layout_alignParentRight="true"
        android:text="下一张" />

</RelativeLayout>

MainActivity.java修改如下:

package com.test.demo;

import com.example.testandroid.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private ImageView imageView;
	private Button buttonNext;
	private Button buttonPre;
	private String urls[] = { "http://pic.yesky.com/uploadImages/2016/065/03/8VG0Q0HU97X3.jpg",
			"http://img.sc115.com/hb/yl1/23/88160202491142.jpg",
			"http://pic.yesky.com/uploadImages/2016/065/48/2A05DMJ41LAN.jpg",
			"http://img4q.duitang.com/uploads/item/201408/12/20140812200853_vVnz2.png" };
	private Handler handler = new Handler();
	private int i=0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		imageView = (ImageView) findViewById(R.id.img);
		buttonNext = (Button) findViewById(R.id.btn_next);
		buttonPre = (Button) findViewById(R.id.btn_pre);
		buttonNext.setOnClickListener(this);
		buttonPre.setOnClickListener(this);
		new LoadThread(urls[0], handler, imageView).start();

	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.btn_next:
			i++;
			new LoadThread(urls[i%4], handler, imageView).start();
			Toast.makeText(MainActivity.this, i%4+"", Toast.LENGTH_SHORT).show();

			break;

		case R.id.btn_pre:
			if(i>0){
				i--;}
				else{
					i=3;
				}
			new LoadThread(urls[i%4], handler, imageView).start();
			Toast.makeText(MainActivity.this, i%4+"", Toast.LENGTH_SHORT).show();

			break;
		}

	}

}

其中注意图片下标的逻辑处理!

运行实例如下:

源码下载

欢迎关注我的博客和微信平台

时间: 2024-08-05 15:24:25

Android实战简易教程-第七十一枪(异步网络下载网络图片及图片廊制作)的相关文章

Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容易,特写下此篇文章.学习就是要有发散思维,要举一反三,大家也可以根据我的实例进行改编,添加和删除一些功能,这样可以提高你对知识的认知!下面我们看一下代码: 1.main.xml: <?xml version="1.0" encoding="utf-8"?>

Android实战简易教程-第六十一枪(圆形显示的ImageView)

ImageView在我们的项目中经常使用,一般ImageView是正方形的,要使用圆形的ImageView可以通过自定义View来实现,下面我们介绍一下如何实现. 1.CircularImageView.java 继承自ImageView: package com.yayun.circularimageview; import com.mikhaellopez.circularimageview.R; import android.content.Context; import android.

Android实战简易教程-第三十一枪(基于加速度传感器的摇一摇功能实例)

下面我们来看一下微信摇一摇功能的模拟实现,我们是基于手机加速度传感器实现该功能,实现方法比较简单. MainActivity.java: MainActivity.java: package com.location.activity; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; i

Android实战简易教程-第七十二枪(PopupWindow浮动窗)

PopupWindow的官方定义例如以下: A popup window that can be used to display an arbitrary view. The popup window is a floating container that appears on top of the current activity. 也就是说它是一个浮动在当前界面上方而且能够显示在任何位置的View,前面的章节我们学习了弹出框,各式各样的,那么PopupWindow应该有两点和弹出框不同,一

Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)

用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以自行注册,得到APPKEY和APPSECRET,然后下载SDK,包的导入方式如截图: 二.主要代码 SMSSendForRegisterActivity.java:(获取验证码页) package com.qiandaobao.activity; import java.util.regex.Mat

Android实战简易教程-第五十五枪(窃听风云之电话录音上传)

前一段时间我写过一篇关于短信监听的文章Android实战简易教程-第四十枪(窃听风云之短信监听),话说现在短信用的越来越少了啊,下面来个更猛的,电话录音监听上传,电话接通后开始录音,电话挂断后将录音上传.这里我们还是借助Bmob提供的上传服务,将录音文件上传到bomb的服务器,可以自行下载,播放录音. 一.配置bmob 配置bmob服务很是简单,注册账号,下载jar包,将jar包引入libs文件目录下: 然后配置权限: <uses-permission android:name="andr

Android实战简易教程-第四十枪(窃听风云之短信监听)

近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台服务,将监听到的短信自己主动上传到bmob数据库中. 一.代码实现: 1.首先实现javabean对象. package com.example.messagecut; import cn.bmob.v3.BmobObject; public class MsgContent extends Bmo

Android实战简易教程-第五十四枪(通过实现OnScrollListener接口实现下拉刷新功能)

上一篇文章Android实战简易教程-第五十三枪(通过实现OnScrollListener接口实现上拉加载更多功能)讲述了如何实现上拉加载更多的功能,本篇,我们在上一篇的基础上实现下拉刷新功能.主要通过对滚动状态和手势监听实现这一功能,下面我们看一下代码: 1.header.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sch

Android实战简易教程-第五十枪(工具类的测试)

在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一个工具类,这里我们自定义了一个连接图灵机器人API的网络测试类: package com.yayun.chatrobot.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.I