默认图片: 加载上的图片:


布局文件:activity_show_image.xml文件内容

<RelativeLayout 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:background="@drawable/activity_background">

<TextView
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@drawable/theme_title_red"
android:gravity="center_vertical|center_horizontal"
android:textSize="20dip"
android:text="图片异步加载"
tools:context=".ShowImageActivity" />
<ImageView
android:id="@+id/img1"
android:layout_width="200dip"
android:layout_height="200dip"
android:layout_below="@+id/title_bar"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dip"
android:background="@drawable/coner_img_bg"
android:padding="5dip"
android:src="@drawable/b" />

</RelativeLayout>

2.核心代码:

ShowImageActivity.xml文件内容:


package com.jun.activity;

import java.io.IOException;
import java.net.URL;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;

public class ShowImageActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_image);
loadImage2("http://www.baidu.com/img/baidu_logo.gif", R.id.img1);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_show_image, menu);
return true;
}



final Handler handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
((ImageView) ShowImageActivity.this.findViewById(msg.arg1))
.setImageDrawable((Drawable) msg.obj);
}
};

// 采用handler+Thread模式实现多线程异步加载
private void loadImage2(final String url, final int id) {
Thread thread = new Thread() {
@Override
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(
new URL(url).openStream(), "image.png");
} catch (IOException e) {
Log.d("test", e.getMessage());
}

// 模拟网络延时
SystemClock.sleep(2000);

Message message = handler2.obtainMessage();
message.arg1 = id;
message.obj = drawable;
handler2.sendMessage(message);
}
};
thread.start();
thread = null;
}
}

3.注意:要在配置文件 Manifest.xml文件中加入访问互联网权限信息:

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



4.上面使用的是Handler+Thread+Message模式

这种模式使用了线程,所以可以看到异步加载的效果。

5.如果使用了Handler+Runnable模式


加载图片都是在主线程中进行的,加载图片时候会阻塞Activity默认图片的显示,而是加载完成后,才显示图片至于该种模式为何在主线程中进行加载可以参照: http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038516.html



更多相关文章

  1. Android(安卓)中保存图片的代码
  2. Android广告轮播
  3. 获取Bitmap和对Bitmap的操作工具类
  4. android接入高德路线规划之驾车模式
  5. android 图片手势放大缩小
  6. AsyncTask的使用 (二)图片下载,进度条
  7. Android(安卓)控件之进度加载
  8. Android关于图片和Base64转码的工具类
  9. Android(安卓)ListView 滑到最后一条自动加载

随机推荐

  1. ng- repeat显示的行等于no属性,甚至不显示
  2. 获取下一个DOM元素的ID
  3. 使用Directive通过AngularJS使用指令和数
  4. 你可以在android webview中自动链接日期
  5. 一旦db通过Node.js发生更新,就立即推送数
  6. 带有ng-repeat的空表行,AngularJS
  7. JavaScript--常用互动方法
  8. [JS图表控件]Highcharts:非常漂亮的图表A
  9. JavaScript责任链模式
  10. DHTMLX vs EJS Treegrid vs ExtJS Treegr