在學習”Android異步加載圖像小結”這篇文章時, 發現有些地方沒寫清楚,我就根據我的理解,把這篇文章的代碼重寫整理瞭一遍,下面就是我的整理。
下面測試使用的layout文件:
簡單來說就是 LinearLayout 佈局,其下放瞭5個ImageView。
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical” android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<TextView android:text=”圖片區域開始” android:id=”@+id/textView2″
android:layout_width=”wrap_content” android:layout_height=”wrap_content”></TextView>
<ImageView android:id=”@+id/imageView1″
android:layout_height=”wrap_content” android:src=”@drawable/icon”
android:layout_width=”wrap_content”></ImageView>
<ImageView android:id=”@+id/imageView2″
android:layout_height=”wrap_content” android:src=”@drawable/icon”
android:layout_width=”wrap_content”></ImageView>
<ImageView android:id=”@+id/imageView3″
android:layout_height=”wrap_content” android:src=”@drawable/icon”
android:layout_width=”wrap_content”></ImageView>
<ImageView android:id=”@+id/imageView4″
android:layout_height=”wrap_content” android:src=”@drawable/icon”
android:layout_width=”wrap_content”></ImageView>
<ImageView android:id=”@+id/imageView5″
android:layout_height=”wrap_content” android:src=”@drawable/icon”
android:layout_width=”wrap_content”></ImageView>
<TextView android:text=”圖片區域結束” android:id=”@+id/textView1″
android:layout_width=”wrap_content” android:layout_height=”wrap_content”></TextView>
</LinearLayout>我們將演示的邏輯是異步從服務器上下載5張不同圖片,依次放入這5個ImageView。上下2個TextView 是為瞭方便我們看是否阻塞瞭UI的顯示。
當然 AndroidManifest.xml 文件中要配置好網絡訪問權限。
<uses-permission android:name=”android.permission.INTERNET”></uses-permission>
Handler+Runnable模式
我們先看一個並不是異步線程加載的例子,使用 Handler+Runnable模式。
這裡為何不是新開線程的原因請參看這篇文章:Android Runnable 運行在那個線程 這裡的代碼其實是在UI 主線程中下載圖片的,而不是新開線程。
我們運行下面代碼時,會發現他其實是阻塞瞭整個界面的顯示,需要所有圖片都加載完成後,才能顯示界面。
package ghj1976.AndroidTest;
import java.io.IOException;
import java.net.URL;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadImage(“”, R.id.imageView1);
loadImage(“,
R.id.imageView2);
loadImage(“, R.id.imageView3);
loadImage(“”,
R.id.imageView4);
loadImage(“”,
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) MainActivity.this.findViewById(id))
.setImageDrawable(drawable);
}
});
}
}
Handler+Thread+Message模式
這種模式使用瞭線程,所以可以看到異步加載的效果。
核心代碼:
package ghj1976.AndroidTest;
import java.io.IOException;
import java.net.URL;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadImage2(“”, R.id.imageView1);
loadImage2(“”,
R.id.imageView2);
loadImage2(“”, R.id.imageView3);
loadImage2(“”,
R.id.imageView4);
loadImage2(“”,
R.id.imageView5);
}
final Handler handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
((ImageView) MainActivity.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);