package com.example.ipcplayer.thread;
import java.io.IOException;
import java.net.URL;
import com.example.ipcplayer.R;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Log;
import android.widget.ImageView;
/**
[size=1.8em]Handler+Runnable模式
我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式。
这里为何不是新开线程的原因请参看这篇文章:Android Runnable 运行在那个线程 这里的代码其实是在UI 主线程中下载图片的,而不是新开线程。
我们运行下面代码时,会发现他其实是阻塞了整个界面的显示,需要所有图片都加载完成后,才能显示界面。
**/
//StrictMode is a developer tool which detects things you might be doing by accident and brings them to your attention so you can fix them.
//详见StrictMode文档
//在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网络不能在主程序中进行,
public class Main1Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
// .detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
loadImage("http://www.baidu.com/img/baidu_logo.gif", R.id.imageview1);
loadImage("http://cache.soso.com/30d/img/web/logo.gif", R.id.imageview3);
loadImage("http://csdnimg.cn/www/images/csdnindex_logo.gif",
R.id.imageview4);
loadImage("http://images.cnblogs.com/logo_small.gif",
R.id.imageview5);
}
private Handler handler = new Handler();
private void loadImage(final String url, final int id) {
handler.post(new Runnable() {
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(
new URL(url).openStream(), "image.gif");
} catch (IOException e) {
Log.d("test", e.getMessage());
}
if (drawable == null) {
Log.d("test", "null drawable");
} else {
Log.d("test", "not null drawable");
}
// 为了测试缓存而模拟的网络延时
SystemClock.sleep(2000);
((ImageView) Main1Activity.this.findViewById(id))
.setImageDrawable(drawable);
}
});
}
}