第136页
(1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后在默认添加的线性布局管理器中添加一个ImageView组件,并且设置该组件默认显示的图片,关键代码如下:
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:src="@drawable/hint" />
(2)在该MainActivity中,声明一个代表ImageView组件的对象,具体代码如下:
private ImageView iv; //声明ImageView组件的对象
(3)编写getPicture()方法,用于根据给定的网址从网络上获取图片,并根据获取到的图片创建一个Bitmap对象。getPicture()方法的具体代码如下:
/**
* 功能:根据网址获取图片对应的Bitmap对象
* @param path
* @return
*/
public Bitmap getPicture(String path){
Bitmap bm=null;
try {
URL url=new URL(path); //创建URL对象
URLConnection conn=url.openConnection(); //获取URL对象对应的连接
conn.connect(); //打开连接
InputStream is=conn.getInputStream(); //获取输入流对象
bm=BitmapFactory.decodeStream(is); //根据输入流对象创建Bitmap对象
} catch (MalformedURLException e1) {
e1.printStackTrace(); //输出异常信息
} catch (IOException e) {
e.printStackTrace(); //输出异常信息
}
return bm;
}
(4)在onCreate()方法中,获取布局管理器中添加的ImageView组件,并创建和开启一个新线程,在创建线程时,需要重写它的run()方法,在重写的run()方法中调用getPicture()方法从网络上获取图片,然后让线程休眠2秒钟,再通过View组件的post()方法发送一个Runnable对象,修改ImageView中显示的图片,具体代码如下:
iv = (ImageView) findViewById(R.id.imageView1); //获取布局管理器中添加的ImageView
//创建一个新线程,用于从网络上获取图片
new Thread(new Runnable() {
public void run() {
//从网络上获取图片
final Bitmap bitmap=getPicture("http://192.168.1.66:8081/test/images/android.png");
try {
Thread.sleep(2000); //线程休眠2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送一个Runnable对象
iv.post(new Runnable() {
public void run() {
iv.setImageBitmap(bitmap); //在ImageView中显示从网络上获取到的图片
}
});
}
}).start(); //开启线程
(5)由于在本实例中需要访问网络资源,所以还需要在AndroidManifest.xml文件中指定允许访问网格资源的权限,具体代码如下:
运行本实例,首先显示如图12.6所示的默认图片,几秒钟后,将显示如图12.7所示的从网络中获取的图片。
图12.6 显示默认的图片 图12.7 显示网络图片
12.2.5 范例2:开启新线程实现电子广告牌
例12.5 在Eclipse中创建Android项目,名称为12.5,开启新线程实现电子广告牌。(实例位置:光盘\TM\sl\12\12.5)
(1)修改新建项目的res\layout目录下的布局文件main.xml,在默认添加的TextView组件上方添加一个ImageView组件,用于显示广告图片,并设置垂直线性布局管理器内的组件水平居中显示,具体代码请参见光盘。
(2)打开默认添加的MainActivity,让该类实现Runnable接口,修改后的创建类的代码如下:
public class MainActivity extends Activity implements Runnable {}
(3)实现Runnable接口中的run()方法,在该方法中,判断当前线程是否被中断,如果没有被中断,则首先产生一个随机数,然后获取一个Message,并将要显示的广告图片的索引值和对应标题保存到该Message中,再发送消息,最后让线程休眠2秒钟,具体代码如下:
@Override
public void run() {
int index = 0;
while (!Thread.currentThread().isInterrupted()) {
index = new Random().nextInt(path.length); //产生一个随机数
Message m = handler.obtainMessage(); //获取一个Message
m.arg1 = index; //保存要显示广告图片的索引值
Bundle bundle = new Bundle(); //获取Bundle对象
m.what = 0x101; //设置消息标识
bundle.putString("title", title[index]); //保存标题
m.setData(bundle); //将Bundle对象保存到Message中
handler.sendMessage(m); //发送消息
try {
Thread.sleep(2000); //线程休眠2秒钟
} catch (InterruptedException e) {
e.printStackTrace(); //输出异常信息
}
}
}
(4)在该MainActivity中,创建程序中所需的成员变量,具体代码如下: